2012-12-05 4 views
13

में CreateObject का समतुल्य कोड मेरे पास वीबी 6 में एक कोड है। क्या कोई मुझे बता सकता है कि इसे 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 के बराबर क्या है ?. मैं कॉम वस्तु में संदर्भ जोड़ने की कोशिश, लेकिन आप या बाद में .net 4 का उपयोग कर रहे हैं, और इसलिए यदि dynamic का उपयोग कर सकते मैं Broker.Application या AmiBroker

+0

कुछ ऐसा ike यह http://novicksoftware.com/TipsAndTricks/tip-csharp-create-com-object-by-progid.htm। यदि आप .NET4.0 का उपयोग कर रहे हैं तो आप सदस्यों तक पहुंचने के लिए गतिशील का उपयोग कर सकते हैं। – user629926

उत्तर

24

रूप में किसी भी कॉम वस्तु नहीं मिल रहा है, तो आप इस काफी क्या कर सकते हैं बस। यहां एक उदाहरण दिया गया है जो एक्सेल ऑटोमेशन इंटरफ़ेस का उपयोग करता है।

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 ऑब्जेक्ट के लिए सही संदर्भ नहीं पा रहे हैं?

+1

जिन लोगों के साथ मैं संकलित करता हूं, उनके लिए माइक्रोसॉफ्ट का उल्लेख करना सुनिश्चित करें। क्रिसप और सिस्टम। कोर। – wbt11a

5

आप .NET फ्रेमवर्क 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; } 
    } 
} 

}

इसके बाद आप सभी AmiBroker OLE स्वचालन कक्षाएं लपेट चाहिए। उदाहरण के लिए टीका वर्ग लपेट:

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

यहाँ सी # कोड मैं 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/

आशा इससे कम से कम कुछ आपकी मदद करते हैं। मैंने इन दोनों विधियों का उपयोग अमीब्रोकर और सी # के साथ किया है, लेकिन मैंने उन्हें पीछे छोड़ दिया। COM और Amibroker अच्छी तरह से मिश्रण नहीं है। यहां तक ​​कि टीजे भी ऐसा कहता है।

वैसे भी शुभकामनाएं।