什么是选择的时候使用的一个。净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编译器。

其他提示

有两个选项。

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

其次,你可以使用 CLR托管的API 来直接承载CLR,并加载组件。这个工作没有COM。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top