Código equivalente de CreateObject en C #

Tengo un código en VB6. ¿Alguien puede decirme cómo escribirlo en C# . Este código es a continuación:

 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 

¿Cuál es el equivalente de CreateObject en C # ?. Intento agregar referencias al objeto com pero no puedo encontrar ningún objeto com como Broker.Application o amibroker

Si está utilizando .net 4 o posterior, y por lo tanto puede hacer uso de la dynamic , puede hacerlo de manera bastante simple. Aquí hay un ejemplo que usa la interfaz de automatización de Excel.

 Type ExcelType = Type.GetTypeFromProgID("Excel.Application"); dynamic ExcelInst = Activator.CreateInstance(ExcelType); ExcelInst.Visible = true; 

Si no puedes usar la dinámica entonces es mucho más complicado.

 Type ExcelType = Type.GetTypeFromProgID("Excel.Application"); object ExcelInst = Activator.CreateInstance(ExcelType); ExcelType.InvokeMember("Visible", BindingFlags.SetProperty, null, ExcelInst, new object[1] {true}); 

Tratar de hacer mucho de eso le quitará la sangre vital.

COM es mucho más fácil si puede utilizar el envío encuadernado temprano en lugar del límite posterior como se muestra arriba. ¿Estás seguro de que no puedes encontrar la referencia correcta para el objeto COM?

Si usa .NET Framework 4.0 y superior, puede usar este patrón:

 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; } } } 

}

A continuación, debe ajustar todas las clases de Automatización OLE de AmiBroker. Por ejemplo, la clase Commentary wrap:

 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); } } 

Aquí hay un fragmento del código C # que utilicé para automatizar Amibroker (desde cuando entré en ese camino). Tendrá que hacer referencia a 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(); 

Sin embargo, escribir un punto no mostrará los métodos internos de comObject.

Todo lo que puedo decir sobre este método es que funciona, como un amuleto, pero aléjate de él, como dijo David. Tengo mi inspiración para este método de:

http://www.codeproject.com/Articles/148959/How-the-new-C-dynamic-type-can-simplify-access-to

Para otro ángulo de ataque, es posible que desee verificar (creo que esto es vinculante):

http://adamprescott.net/2012/04/05/net-vb6-interop-tutorial/

Espero que al menos algo de esto te ayude. He usado ambos métodos con Amibroker y C #, pero terminé dejándolos atrás. COM y Amibroker no se mezclan bien. Incluso TJ lo dice.

Buena suerte de todos modos.