2009-12-01 17 views
8

Win32 प्रक्रिया से .NET DLL का उपयोग करने के दौरान क्या विकल्प हैं? मुझे मूल रूप से Win32 प्रक्रिया से C# DLL का उपयोग करने की आवश्यकता है।Win32 प्रक्रिया से .NET DLL को कैसे कॉल करें?

मेरे पास अभी एक संभावित समाधान है जिसके लिए सीएसी डीएलएल को जीएसी (RegAsm.exe का उपयोग करके) जोड़ने की आवश्यकता है, फिर सी # डीएलएल को COM wrapped call के माध्यम से कॉल करना होगा। हालांकि यह समाधान काफी भारी है। यह आवश्यक है कि इस Win32 प्रक्रिया को चलाने वाली सभी मशीनों पर .NET DLL को GAC में जोड़ा जाए।

सी # डीएलएल का उपयोग करने में सक्षम होने से पहले RegAsm पर कॉल किए बिना ऐसा करना संभव होगा?

+0

यह Regasm.exe/codebase विकल्प के साथ जीएसी में होना आवश्यक नहीं है। –

उत्तर

11

आप .NET COM घटकों के साथ पंजीकरण-मुक्त COM का उपयोग कर सकते हैं - here देखें।

एक और विकल्प एक पुल के रूप में सी ++/सीएलआई का उपयोग करना है। लोग प्रबंधित कोड पर बेनकाब करने के लिए अप्रबंधित एपीआई को लपेटने के लिए इसका उपयोग करने से अधिक परिचित हैं, लेकिन यह वास्तव में दोनों तरीकों से काम करता है - /clr के साथ संकलित करना संभव है, और फिर भी .dll असेंबली सादे अप्रबंधित निर्यात के साथ असेंबली का उत्पादन करें, जिसे अप्रबंधित कोड से बुलाया जा सकता है हमेशा की तरह। यहाँ एक बहुत ही सरल उदाहरण है कि को उजागर करता है System::String::ToUpper कि जिस तरह से है:

// compile with cl.exe /clr /LD wrapper.cpp ole32.lib 

#include <windows.h> 

__declspec(dllexport) 
wchar_t* ToUpper(const wchar_t* wcs) 
{ 
    System::String^ s = gcnew System::String(wcs); 
    array<wchar_t>^ chars = s->ToUpper()->ToCharArray(); 

    size_t size = chars->Length * 2; 
    wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2); 
    pin_ptr<wchar_t> src = &chars[0]; 
    memcpy(dst, src, size); 
    dst[chars->Length] = 0; 
    return dst; 
} 

यह उत्पादन करेगा wrapper.dll - संकर कामयाब/अप्रबंधित विधानसभा - और एक निर्यात पुस्तकालय wrapper.lib। बाद के एक शुद्ध देशी आवेदन में इस प्रकार किया जा सकता है:

// compile with cl.exe test.cpp ole32.lib wrapper.lib 
// note, no /clr 

#include <stdio.h> 
#include <windows.h> 

wchar_t* ToUpper(const wchar_t* wcs); 

int main() 
{ 
    wchar_t* s = ToUpper(L"foo"); 
    wprintf(L"%s", s); 
    CoTaskMemFree(s); 
} 

अभ्यास यह फोन करने की प्रक्रिया में CLR क्रम लोड होगा (जब तक यह पहले से ही वहाँ से भरी हुई है) और पारदर्शी प्रबंधित कोड के मूल कोड से प्रेषण में - सब जादू सी ++/सीएलआई कंपाइलर द्वारा किया जाता है।

+0

यह बहुत अच्छा लगता है, बहुत बहुत धन्यवाद। मैं इस समाधान का पता लगाऊंगा –

+0

* 'here' * अंक [पंजीकरण-मुक्त सक्रियण के लिए .NET- आधारित घटक कॉन्फ़िगर करना] (https://msdn.microsoft.com/en-us/library/eew13bza (VS.71) .aspx) ... यदि एमएस इसे (ओं) को स्थानांतरित करने का निर्णय लेता है ... – Wolf

7

दो विकल्प हैं।

सबसे पहले, आप Registration Free COM Interop का उपयोग कर सकते हैं।

दूसरा, आप सीधे सीएलआर होस्ट करने के लिए CLR Hosting APIs का उपयोग कर सकते हैं, और असेंबली लोड कर सकते हैं। यह COM के बिना काम करता है।

+1

सीएलआर होस्टिंग एपीआई का उपयोग अप्रत्यक्ष रूप से सी ++/सीएलआई का शोषण करके किया जा सकता है - मेरे उत्तर में अपडेट देखें। –

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