8


1

Win32プロセスから.NET DLLを呼び出す方法は?

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

現在、C#DLLを(RegAsm.exeを使用して)GACに追加し、COMラップ呼び出しを介してC#DLLを呼び出す必要がある解決策があります。 しかし、その解決策はかなり重いです。 このWin32プロセスを実行するすべてのマシンで、.NET DLLをhttps://msdn.microsoft.com/en-us/library/yf1d93sz.aspx[GAC]に追加する必要があります。

C#DLLを使用できるようになる前に `RegAsm`を呼び出さずにこれを行うことは可能でしょうか?

2 Answer


11


NET COMコンポーネントで登録不要のCOMを使用できます-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

__declspec(dllexport)
wchar_t* ToUpper(const wchar_t* wcs)
{
    System::String^ s = gcnew System::String(wcs);
    array^ chars = s->ToUpper()->ToCharArray();

    size_t size = chars->Length * 2;
    wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2);
    pin_ptr 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
#include

wchar_t* ToUpper(const wchar_t* wcs);

int main()
{
    wchar_t* s = ToUpper(L"foo");
    wprintf(L"%s", s);
    CoTaskMemFree(s);
}

実際には、CLRランタイムを呼び出しプロセスにロードし(既にロードされていない場合)、ネイティブコードからマネージコードに透過的にディスパッチします。すべての魔法はC ++ / CLIコンパイラーによって実行されます。


7


2つの選択肢があります。

まず、http://msdn.microsoft.com/en-us/library/fh1h056h.aspx [Registration Free COM Interop]を使用できます。

次に、http://msdn.microsoft.com/en-us/magazine/cc163567.aspx [CLR Hosting APIs]を使用してCLRを直接ホストし、アセンブリを読み込むことができます。 これはCOMなしで機能します。