2011-07-07 6 views
2

.NET 4ランタイムをロードして、独自のC#DLLを実行しようとしています。 Start()メソッドは、HRESULT = 0x1エラーをスローしています。開始コードをコメントアウトすると、C#DLLがロードされて実行され、Stop()メソッドがHRESULT = 0x8000ffffエラーをスローします。私は何時間も探しましたが、すべてのコードは以下のようになっています(私はすべてのデバッグ/エラー処理を省略しました)。事前にご一読いただきありがとうございます! =)CLRをC++にロードする、Start()の問題

void DotNetLoad() 
    { 
     ICLRRuntimeHost *pClrHost = NULL; 
     ICLRMetaHost *lpMetaHost = NULL; 
     MessageBox(0, L"Creating CLR instance.", L"Bootstrap Message", 0); 
     HRESULT hr = CLRCreateInstance(
      CLSID_CLRMetaHost, 
      IID_PPV_ARGS(&lpMetaHost)); 
     ICLRRuntimeInfo *lpRuntimeInfo = NULL; 
     hr = lpMetaHost->GetRuntime(L"v4.0.30319", 
      IID_PPV_ARGS(&lpRuntimeInfo)); 
     hr = lpRuntimeInfo->GetInterface(
      CLSID_CLRRuntimeHost, 
      IID_ICLRRuntimeHost, 
      (LPVOID *)&pClrHost); 
     hr = pClrHost->Start(); 
     DWORD dwRet = 0; 
     hr = pClrHost->ExecuteInDefaultAppDomain(
      pwzTargetDll, 
      pwzNamespaceClass, pwzFunction, L"pwzArgument", &dwRet); 
     hr = pClrHost->Stop(); 
     hr = pClrHost->Release(); 

    } 

私は、init、.NETコール、およびdeinitデカップリングについて少し理解していますが、アプリの起動とシャットダウンによって何を意味するのですか?今私はリモートプロセスに注入されるDLLメソッドから呼び出されているDotNetLoadを持っています。基本的には:

extern "C" __Declspec(dllexport) void Initialize() 
{ 
    DotNetLoad(params); //ex. 
} 
+0

COMを初期化しましたか? –

+0

返信いただきありがとうございます!申し訳ありませんが、私はCOMについてよく分かりません。 CLRコードを開始する前に "CoInitializeEx"のようなことをする必要がありますか? –

+0

STA(シングルスレッド/メッセージポンプディスパッチCOMコール)のCoInitialize()、またはMTA(マルチスレッドCOMコールディスパッチ)の適切なフラグを持つCoInitializeEx()。 COM/OLE機能でMFCを使用している場合は、AfxOleInit()(CoInitialize()+他のMFC固有の初期化の呼び出し)を呼び出す必要があります。 –

答えて

1

ランタイムdeinit続くアセンブリメソッドの呼び出しで実行時の初期化を組み合わせることにより、あなたはDotNetLoadにすべての呼び出しにこのコードを実行されています()。

ここで重要なブロックを参照してください - http://msdn.microsoft.com/en-us/library/ms164416.aspxこれは、実行時にプロセスにランタイムをロードすると、再度実行したくないと考えています。

.NETアセンブリの呼び出しに使用したメソッドの初期化/初期化解除を分割します。初期化は一度だけ(アプリ起動時と呼び出し前に)行い、初期化は一度(アプリのシャットダウン時)に行う。私はこれをテストし、それは間違いなく働いた。

関連する問題