如何从Win32进程调用.NET DLL?

从Win32进程使用.NET DLL有哪些选择? 我需要基本上使用Win32进程中的C#DLL。

我现在有一个可能的解决方案,需要将C#DLL添加到GAC(使用RegAsm.exe),然后通过COM包装调用调用C#DLL。 然而,这个解决方案非常重。 它要求在应该运行此Win32进程的所有计算机上将.NET DLL添加到GAC 。

是否可以这样做而无需在能够使用C#DLL之前调用RegAsm

您可以使用.NET COM组件免注册COM – 请参阅此处 。

另一种选择是使用C ++ / CLI作为桥梁。 人们大多熟悉使用它来包装非托管API以暴露给托管代码,但它实际上有两种方式 – 可以使用/clr进行编译,然后使用普通的非托管导出生成.dll程序集,可以从像往常一样非托管代码。 这是一个非常简单的示例,它以这种方式公开System::String::ToUpper

 // compile with cl.exe /clr /LD wrapper.cpp ole32.lib #include  __declspec(dllexport) wchar_t* ToUpper(const wchar_t* wcs) { System::String^ s = gcnew System::String(wcs); array^ chars = s->ToUpper()->ToCharArray(); size_t size = chars->Length * 2; wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2); pin_ptr 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  #include  wchar_t* ToUpper(const wchar_t* wcs); int main() { wchar_t* s = ToUpper(L"foo"); wprintf(L"%s", s); CoTaskMemFree(s); } 

实际上,它会将CLR运行时加载到调用进程中(除非它已经在那里加载)并从本机代码透明地分发到托管代码 – 所有的魔力都是由C ++ / CLI编译器完成的。

有两种选择。

首先,您可以使用免费注册COM互操作 。

其次,您可以使用CLR Hosting API直接托管CLR,并加载程序集。 这没有COM。