Zor*_*mic 8 .net c# mixed-mode
从Win32进程使用.NET DLL有哪些选择?我需要基本上使用Win32进程中的C#DLL.
我现在有一个可能的解决方案,需要将C#DLL添加到GAC(使用RegAsm.exe),然后通过COM包装调用调用C#DLL.然而,这个解决方案非常重.它要求在应该运行此Win32进程的所有计算机上将.NET DLL添加到GAC.
是否可以这样做而无需在RegAsm使用C#DLL之前调用?
Pav*_*aev 11
您可以使用.NET COM组件免注册COM - 请参阅此处.
另一种选择是使用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;
}
Run Code Online (Sandbox Code Playgroud)
这将产生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);
}
Run Code Online (Sandbox Code Playgroud)
在实践中,它会将CLR运行时加载到调用进程中(除非它已经在那里加载)并从本机代码透明地分发到托管代码 - 所有的魔力都是由C++/CLI编译器完成的.