2011-07-07 42 views
2

所以我想加載.NET 4運行時並運行我自己的C#DLL。 Start()方法拋出HRESULT = 0x1錯誤。如果我註釋掉開始代碼,C#DLL加載並執行,則Stop()方法將引發HRESULT = 0x8000ffff錯誤。我查了幾個小時,所有的代碼看起來像我在下面(我忽略了所有的調試/錯誤處理)。非常感謝您提前提供任何提示! =)在C++中加載CLR,啓動()問題

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(); 

    } 

我瞭解解耦初始化,.NET調用,DEINIT位,但你是什麼應用程序啓動和關機是什麼意思?現在我已經從注入到遠程進程的DLL方法中調用了DotNetLoad。基本上:

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

你是否初始化COM? –

+0

感謝您的回覆!抱歉,我不太瞭解COM(或者確切地說)。我應該在啓動CLR代碼之前執行「CoInitializeEx」之類的操作嗎? –

+0

CoInitialize()用於STA(單線程/消息泵調度的COM調用)或CoInitializeEx()以及適用於MTA(多線程COM調用調用)的標誌。如果你使用MFC和COM/OLE特性,你必須調用AfxOleInit()(這是對CoInitialize()的調用+某些其他MFC特定的初始化)。 –

回答

1

通過組合與該組件的方法調用運行時初始化,隨後運行時DEINIT,你在每次調用執行此代碼到DotNetLoad()。

看到這裏的重要塊 - http://msdn.microsoft.com/en-us/library/ms164416.aspx這使我相信,一旦你加載運行時到你的過程中,你不想再做一次。

將用於調用.NET程序集的方法拆分爲初始化/取消初始化。只進行一次初始化(在應用程序啓動時以及進行調用之前),並且僅執行一次初始化(應用程序關閉時)。我測試了這個,它沒有錯誤地工作。