2009-08-29 17 views
6

प्रत्येक उदाहरण जो मैं पा सकता हूं वह सी ++ में है, लेकिन मैं अपनी परियोजना को सी में रखने की कोशिश कर रहा हूं। क्या सी प्रोग्राम में सीएलआर होस्ट करना भी संभव है?क्या सी प्रोग्राम में सीएलआर होस्ट करना संभव है?

यदि हां, तो क्या आप मुझे एक उदाहरण के लिए इंगित कर सकते हैं?

+3

सीएलआर एपीआई एक COM API है। असल में, आपको सी –

+0

में COM इंटरफेस को कॉल करना चाहिए ... और ऐसा करने के लिए, आप यहां एक लेख पा सकते हैं: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

मैं जा रहा हूं ईमानदार रहो और कहें कि मुझे बिल्कुल नहीं पता कि मैं क्या कर रहा हूं। मैं एक सी # लड़का हूं, एक सी लड़का नहीं, इसलिए लेख मुझे थोड़ा समझ में आता है। क्या सीएलआर की मेजबानी का एक विशिष्ट उदाहरण है, एक .NET ऑब्जेक्ट उदाहरण बना रहा है, और उस पर एक विधि निष्पादित कर रहा है (जिसे मैं महसूस करता हूं शायद काफी जटिल है)? –

उत्तर

10

उपरोक्त टिप्पणियों के संकेत के रूप में, COM APIs for hosting the CLR का एक सेट है, और आप इन COM API को सी और सी ++ दोनों से कॉल करने में सक्षम होना चाहिए।

उदाहरण के तौर पर, नीचे एक त्वरित टुकड़ा (अवांछित) सी कोड है जो दिखाता है कि सीएलआर कैसे शुरू करें और एक प्रबंधित असेंबली में कक्षा की स्थिर विधि निष्पादित करें (जो तर्क और रिटर्न के रूप में स्ट्रिंग में लेता है पूर्णांक)। इस कोड और उसके सी ++ समकक्ष के बीच महत्वपूर्ण अंतर सीएलआर-होस्टिंग COM इंटरफ़ेस में कॉल करने के लिए COBJMACROS की परिभाषा है और <type>_<method> मैक्रोज़ (उदा। ICLRRuntimeHost_Start) का उपयोग है। ('ध्यान दें कि COBJMACROS#include से पहले परिभाषित किया जाना चाहिए mscoree.h ing सुनिश्चित करें कि इन उपयोगिता मैक्रो निर्धारित हो बनाने के लिए।)

#include <windows.h> 

#define COBJMACROS 
#include <mscoree.h> 

int main(int argc, char **argv) 
{ 
    HRESULT status; 
    ICLRRuntimeHost *Host; 
    BOOL Started; 
    DWORD Result; 

    Host = NULL; 
    Started = FALSE; 

    status = CorBindToRuntimeEx(
       NULL, 
       NULL, 
       0, 
       &CLSID_CLRRuntimeHost, 
       &IID_ICLRRuntimeHost, 
       (PVOID *)&Host 
       ); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    status = ICLRRuntimeHost_Start(Host); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    Started = TRUE; 

    status = ICLRRuntimeHost_ExecuteInDefaultAppDomain(
       Host, 
       L"c:\\path\\to\\assembly.dll", 
       L"MyNamespace.MyClass", 
       L"MyMethod", 
       L"some string argument to MyMethod", 
       &Result 
       ); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    // inspect Result 
    // ... 

cleanup: 
    if (Started) { 
     ICLRRuntimeHost_Stop(Host); 
    } 

    if (Host != NULL) { 
     ICLRRuntimeHost_Release(Host); 
    } 

    return SUCCEEDED(status) ? 0 : 1; 
} 

यह नमूना नेट 2.0+ साथ काम करना चाहिए, हालांकि यह .NET 4.0 (तरह लग रहा है अभी तक जारी नहीं किया गया है) ने इन कुछ एपीआई को new set of APIs for hosting the CLR के पक्ष में बहिष्कृत कर दिया है। (और यदि आपको .NET 1.x के साथ काम करने की आवश्यकता है, तो आपको ICLRRuntimeHost के बजाय ICorRuntimeHost का उपयोग करने की आवश्यकता है।)

+0

कोई अनुमान है कि यह क्यों काम नहीं करेगा: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

संबंधित मुद्दे