2009-12-01 15 views
8

Bir Win32 işleminden .NET DLL kullanıldığında seçenekler nelerdir? Temelde bir Win32 işleminden C# DLL kullanmam gerekiyor.Bir Win32 işleminden .NET DLL nasıl aranır?

Şu anda C# DLL'lerini (RegAsm.exe'yi kullanarak) C# DLL'i eklemeyi ve ardından COM'lu çağrılarla C# DLL'i çağırmayı gerektiren olası bir çözümüm var. Bununla birlikte, bu çözüm oldukça ağırdır. Bu Win32 işlemi çalıştırması gereken tüm makinelerde GAC için .NET DLL eklenmesini gerektirir.

C# DLL kullanmak mümkün olmadan önce RegAsm aramak zorunda kalmadan bunu yapmak mümkün mü?

+0

Regasm.exe/codebase seçeneği ile GAC içinde olması gerekmez. –

cevap

11

Kayıt olmadan COM ile .NET COM bileşenlerini kullanabilirsiniz - bkz. here.

Başka bir seçenek de C++/CLI'yi köprü olarak kullanmaktır. Yönetilen koda maruz kalmaları için yönetilmeyen API'leri çoğunlukla kullanmaya alışkın olduklarını biliyoruz, ancak aslında her iki şekilde de çalışıyor. /clr ile derlemek ve yönetilmeyen koddan çağrılabilen düz yönetilmeyen dışa aktarmalarla .dll derleme üretmek mümkün her zaman oldugu gibi. İşte System::String::ToUpper bu şekilde ortaya çok basit bir örnek:

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

Bu wrapper.dll üretecek -/hibrit yönetilen yönetilmeyen montaj - ve bir ihracat kütüphane wrapper.lib. aşağıdaki gibi ikinci bir saf doğal uygulamasında kullanılabilir:

şeffaf yönetilen kod yerel koddan (zaten orada yüklü olmaması durumunda) bu çağıran süreci içine CLR çalışma zamanını yükleyecektir uygulama ve sevk yılında
// 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); 
} 

- tüm büyü C++/CLI derleyici tarafından yapılır.

+0

Bu çok iyi geliyor, çok teşekkürler. Bu çözümü –

+0

* 'burada' * [Kayıt Olmadan Aktivasyon için .NET Tabanlı Bileşenleri Yapılandırma] [https://msdn.microsoft.com/en-us/library/eew13bza (VS.71) adresinde inceleyeceğim .aspx) ... MS'in yeniden (re) hareket etmeye karar vermesi durumunda ... – Wolf

7

İki seçenek vardır.

İlk olarak, Registration Free COM Interop'u kullanabilirsiniz.

İkinci olarak, doğrudan CLR'yi barındırmak ve derlemeyi yüklemek için CLR Hosting APIs'u kullanabilirsiniz. Bu COM olmadan çalışır.

+1

CLR barındırma API'leri C++/CLI'yi kullanarak dolaylı olarak kullanılabilir - cevabımdaki güncellemeye bakın. –