從Win32進程使用.NET DLL有什麼選擇? 我需要從Win32進程中基本使用C#DLL。如何從Win32進程調用.NET DLL?
我現在有一個可能的解決方案,需要將C#DLL添加到GAC(使用RegAsm.exe),然後通過COM打包調用調用C#DLL。 但是這個解決方案相當繁重。它要求將.NET DLL添加到應該運行此Win32進程的所有機器上的GAC。
在使用C#DLL之前,無需調用RegAsm
就可以做到這一點嗎?
從Win32進程使用.NET DLL有什麼選擇? 我需要從Win32進程中基本使用C#DLL。如何從Win32進程調用.NET DLL?
我現在有一個可能的解決方案,需要將C#DLL添加到GAC(使用RegAsm.exe),然後通過COM打包調用調用C#DLL。 但是這個解決方案相當繁重。它要求將.NET DLL添加到應該運行此Win32進程的所有機器上的GAC。
在使用C#DLL之前,無需調用RegAsm
就可以做到這一點嗎?
您可以使用免註冊COM與.NET COM組件 - 請參閱here。
另一種選擇是使用C++/CLI作爲橋樑。人們大多熟悉使用它來包裝非託管API以暴露給託管代碼,但實際上這兩種方式都有效 - 可以使用/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運行時加載到調用進程(除非它已經加載有)和調度從本機代碼託管代碼透明的 - 所有的魔術是由C++/CLI編譯器完成的。
這聽起來很不錯,非常感謝。我將探索此解決方案 – 2009-12-02 19:08:08
*'here' *指向[配置免註冊激活的基於.NET的組件](https://msdn.microsoft.com/en-us/library/eew13bza(VS.71) .aspx)...如果MS決定(重新)移動此... – Wolf 2017-01-10 14:45:46
有兩種選擇。您可以使用Registration Free COM Interop。
其次,您可以使用CLR Hosting APIs來直接託管CLR並加載程序集。這沒有COM的作品。
CLR託管API可通過利用C++/CLI間接使用 - 請參閱我的答案的更新。 – 2009-12-01 01:56:24
它不必在GAC中使用Regasm.exe/codebase選項。 – 2009-12-01 02:52:12