8

Win32プロセスから.NETDLLを使用する場合のオプションは何ですか?基本的に、Win32プロセスのC#DLLを使用する必要があります。

現在、GACにC#DLLを追加して(RegAsm.exeを使用)、COMラップされた呼び出しを介してC#DLLを呼び出す必要がある解決策があります。ただし、その解決策はかなり重いです。このWin32プロセスを実行することになっているすべてのマシンのGACに.NETDLLを追加する必要があります。

RegAsmC#DLLを使用できるようになる前に呼び出す必要なしにこれを行うことは可能でしょうか?

4

2 に答える 2

11

.NETCOMコンポーネントで登録不要のCOMを使用できます。ここを参照してください。

もう1つのオプションは、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コンパイラによって実行されます。

于 2009-12-01T01:26:06.310 に答える
7

2つのオプションがあります。

まず、 Registration FreeCOMInteropを使用できます。

次に、CLRホスティングAPIを使用してCLRを直接ホストし、アセンブリを読み込むことができます。これはCOMなしで機能します。

于 2009-12-01T01:50:58.737 に答える