题
什么是选择的时候使用的一个。净DLL从Win32进程?我需要到基本上使用C#DLL从Win32过程。
我有一个可能的解决方案,现在需要加入C#DLL向政府咨询委员会(使用RegAsm.exe),然后呼吁C#DLL通过COM包裹的电话。然而,方案是相当沉重的。它要求。净DLL能加入 GAC 在所有的机器都应该跑的这Win32过程。
才有可能做到这一点,而不必叫 RegAsm
之前能够使用的C#DLL?
解决方案
你可以使用免注册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;
}
这将产生 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编译器。
其他提示
不隶属于 StackOverflow