1

アンマネージ C++ コードからの .net メソッドの呼び出しを調査しており、マネージ .NET アセンブリ (DLL) を別のプロセスに挿入する方法で以下の関数を見つけました。

void StartTheDotNetRuntime()
{
    // Bind to the CLR runtime..
    ICLRRuntimeHost *pClrHost = NULL;
    HRESULT hr = CorBindToRuntimeEx(
        NULL, L"wks", 0, CLSID_CLRRuntimeHost,
        IID_ICLRRuntimeHost, (PVOID*)&pClrHost);

    // Push the CLR start button
    hr = pClrHost->Start();

    // Okay, the CLR is up and running in this (previously native) process.
    // Now call a method on our managed class library.
    DWORD dwRet = 0;
    hr = pClrHost->ExecuteInDefaultAppDomain(
        L"c:\\PathToYourManagedAssembly\\MyManagedAssembly.dll",
        L"MyNamespace.MyClass", L"MyMethod", L"MyParameter", &dwRet);

    // Stop the CLR runtime
    hr = pClrHost->Stop();

    // Don't forget to clean up.
    pClrHost->Release();
}

これは、コンソール アプリケーションで 1 回呼び出されると問題なく動作します。

この関数を dll 内で使用するために分割したいと考えています。論理的には、これは 3 つの部分に分割する必要があります。

Method - DLLMain
    DLL_PROCESS_ATTACH
         Bind to the CLR runtime
         Push the CLR start button

    DLL_PROCESS_DETACH
         Stop the CLR runtime
         Do not forget to clean up.

Method - CallDotNetToDoSomething

これを実現するために、ICLRRuntimeHost pClrHost/HRESULT hr を宣言する方法と場所を教えてください。

4

1 に答える 1

1

それらはおそらくグローバル(静的)変数であるか、ある種のシングルトンである必要があります。プロセスごとに許可される .NET ランタイムは 1 つだけです (少なくとも最近では)。DLL ロードでグローバルにデータを入力し、DLL のアンロード時にそれらをデポピュレートします。

私が行った .NET/Mono 埋め込みプロジェクトでは、コンストラクターがランタイムを起動し (バインド/開始ボタンを押す)、デストラクタがランタイムをシャットダウンする (停止/解放) オブジェクトを作成しました。このようにして、メイン アプリケーションは動作方法を選択できます。つまり、main() でスタックに置くか、DLL のロード中に new() を実行し、DLL のアンロードで削除します。その場合、言及するポインタは、ClrEmbedManager など、作成した新しいオブジェクトのインスタンス変数になります。ライブラリをさまざまな動作のさまざまな種類のアプリケーションで再利用する必要がない場合、これはやり過ぎです。

于 2009-04-21T16:42:43.997 に答える