在 Win32 进程中使用 .NET DLL 时有哪些选项?
我基本上需要使用 Win32 进程中的 C# DLL。
我现在有一个可能的解决方案,需要将 C# DLL 添加到 GAC(使用 RegAsm.exe),然后通过 COM 包装调用来调用 C# DLL。
然而,这个解决方案相当沉重。它要求将 .NET DLL 添加到GAC https://msdn.microsoft.com/en-us/library/yf1d93sz.aspx在所有应该运行此 Win32 进程的计算机上。
是否可以在不打电话的情况下做到这一点RegAsm
在能够使用 C# DLL 之前?
您可以将免注册 COM 与 .NET COM 组件一起使用 - 请参阅here http://msdn.microsoft.com/en-us/library/eew13bza(VS.71).aspx.
另一种选择是使用 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 编译器完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)