Эквивалентный код CreateObject в С#
У меня есть код в VB6. Может ли кто-нибудь сказать мне, как записать его в C#
. Этот код ниже:
Set Amibroker = CreateObject("Broker.Application")
Set STOCK = Amibroker.Stocks.Add(ticker)
Set quote = STOCK.Quotations.Add(stInDate)
quote.Open = stInOpen
quote.High = stInHigh
quote.Low = stInlow
quote.Close = stInYcp
quote.Volume = stInVolume
Set STOCK = Nothing
Set quote = Nothing
Что эквивалентно CreateObject
в С#?. Я пытаюсь добавить ссылки на com-объект, но я не могу найти какой-либо COM-объект как Broker.Application или amibroker
Ответы
Ответ 1
Если вы используете .net 4 или более позднюю версию и поэтому можете использовать dynamic
, вы можете сделать это довольно просто. Здесь приведен пример использования интерфейса автоматизации Excel.
Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
dynamic ExcelInst = Activator.CreateInstance(ExcelType);
ExcelInst.Visible = true;
Если вы не можете использовать динамический, то это гораздо более грязно.
Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
object ExcelInst = Activator.CreateInstance(ExcelType);
ExcelType.InvokeMember("Visible", BindingFlags.SetProperty, null,
ExcelInst, new object[1] {true});
Попытка сделать очень многое из этого сожжет жизненную силу от вас.
COM намного проще, если вы можете использовать раннюю рассылку, а не позднюю, как показано выше. Вы уверены, что не можете найти правильную ссылку для COM-объекта?
Ответ 2
Если вы используете .NET Framework 4.0 и выше, вы можете использовать этот шаблон:
public sealed class Application: MarshalByRefObject {
private readonly dynamic _application;
// Methods
public Application() {
const string progId = "Broker.Application";
_application = Activator.CreateInstance(Type.GetTypeFromProgID(progId));
}
public Application(dynamic application) {
_application = application;
}
public int Import(ImportType type, string path) {
return _application.Import((short) type, path);
}
public int Import(ImportType type, string path, string defFileName) {
return _application.Import((short) type, path, defFileName);
}
public bool LoadDatabase(string path) {
return _application.LoadDatabase(path);
}
public bool LoadLayout(string path) {
return _application.LoadLayout(path);
}
public int Log(ImportLog action) {
return _application.Log((short) action);
}
public void Quit() {
_application.Quit();
}
public void RefreshAll() {
_application.RefreshAll();
}
public void SaveDatabase() {
_application.SaveDatabase();
}
public bool SaveLayout(string path) {
return _application.SaveLayout(path);
}
// Properties
public Document ActiveDocument {
get {
var document = _application.ActiveDocument;
return document != null ? new Document(document) : null;
}
}
public Window ActiveWindow {
get {
var window = _application.ActiveWindow;
return window != null ? new Window(window) : null;
}
}
public AnalysisDocs AnalysisDocs {
get {
var analysisDocs = _application.AnalysisDocs;
return analysisDocs != null ? new AnalysisDocs(analysisDocs) : null;
}
}
public Commentary Commentary {
get {
var commentary = _application.Commentary;
return commentary != null ? new Commentary(commentary) : null;
}
}
public Documents Documents {
get {
var documents = _application.Documents;
return documents != null ? new Documents(documents) : null;
}
}
public string DatabasePath {
get { return _application.DatabasePath; }
}
public bool Visible {
get { return _application.Visible != 0; }
set { _application.Visible = value ? 1 : 0; }
}
public string Version {
get { return _application.Version; }
}
}
}
Затем вы должны обернуть все классы автоматизации OLE AiBroker. Например, класс комментариев Комментарий:
public sealed class Commentary : MarshalByRefObject {
// Fields
private readonly dynamic _commentary;
// Methods
internal Commentary(dynamic commentary) {
_commentary = commentary;
}
public void Apply() {
_commentary.Apply();
}
public void Close() {
_commentary.Close();
}
public bool LoadFormula(string path) {
return _commentary.LoadFormula(path);
}
public bool Save(string path) {
return _commentary.Save(path);
}
public bool SaveFormula(string path) {
return _commentary.SaveFormula(path);
}
}
Ответ 3
Вот фрагмент кода С#, который я использовал для автоматизации Amibroker (с того момента, когда я пошел по этому пути). Вам нужно будет ссылаться на System.Runtime.Interopservices
System.Type objType = System.Type.GetTypeFromProgID("Broker.Application");
dynamic comObject = System.Activator.CreateInstance(objType);
comObject.Import(0, fileName, "default.format");
comObject.RefreshAll();
Ввод точки не вызовет внутренних методов comObject.
Все, что я могу сказать об этом методе, - это работает, как прелесть, но держитесь подальше от него, как сказал Дэвид. Я получил вдохновение для этого метода:
http://www.codeproject.com/Articles/148959/How-the-new-C-dynamic-type-can-simplify-access-to
Для другого угла атаки вы можете проверить (я думаю, что это раннее связывание):
http://adamprescott.net/2012/04/05/net-vb6-interop-tutorial/
Надеюсь, хотя бы некоторые из них помогут вам. Я использовал оба эти метода с Amibroker и С#, но в итоге я оставил их. COM и Amibroker плохо перемешиваются. Даже TJ так говорит.
Удачи в любом случае.