Win32プロセスから.NET DLLを呼び出す方法は?
-
22-07-2019 - |
質問
Win32プロセスから.NET DLLを使用する場合のオプションは何ですか? 基本的に、Win32プロセスからC#DLLを使用する必要があります。
現在、C#DLLをGACに追加し(RegAsm.exeを使用)、COMラップ呼び出しを介してC#DLLを呼び出す必要があるソリューションがあります。 しかし、その解決策はかなり重いです。 .NET DLLをすべての GAC に追加する必要がありますこのWin32プロセスを実行することになっているマシン。
C#DLLを使用する前に RegAsm
を呼び出さずにこれを実行できますか?
解決
.NET COMコンポーネントで登録不要のCOMを使用できます-こちら。
別のオプションは、C ++ / CLIをブリッジとして使用することです。人々はアンマネージAPIをラップしてマネージコードに公開するためにそれを使用することにほとんど精通していますが、実際には両方の方法で機能します- / clr
でコンパイルし、さらに .dll <を生成することが可能です/ code>アセンブリ。プレーンなアンマネージエクスポートで、通常どおりアンマネージコードから呼び出すことができます。以下は、
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コンパイラーによって実行されます。
他のヒント
2つのオプションがあります。
最初に、登録無料COM相互運用を使用できます。
次に、 CLRホスティングAPI を使用して直接CLRをホストし、アセンブリをロードします。これはCOMなしでも機能します。