.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.
}
COMを初期化しましたか? –
返信いただきありがとうございます!申し訳ありませんが、私はCOMについてよく分かりません。 CLRコードを開始する前に "CoInitializeEx"のようなことをする必要がありますか? –
STA(シングルスレッド/メッセージポンプディスパッチCOMコール)のCoInitialize()、またはMTA(マルチスレッドCOMコールディスパッチ)の適切なフラグを持つCoInitializeEx()。 COM/OLE機能でMFCを使用している場合は、AfxOleInit()(CoInitialize()+他のMFC固有の初期化の呼び出し)を呼び出す必要があります。 –