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

    } 

내가 초기화, .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이어서 조립 방법의 호출을 실행 INIT를 결합하면 DotNetLoad는 모든 호출에 코드가 실행된다().

여기서 중요한 블록보기 - http://msdn.microsoft.com/en-us/library/ms164416.aspx 이렇게하면 런타임을 프로세스에로드하고 나면 다시는 수행하지 않을 것입니다.

.NET 어셈블리를 호출하는 데 사용 된 방법 중 초기화/초기화 해제를 분리하십시오. 초기화를 한 번만 (앱을 시작할 때와 통화하기 전에) 수행하고 초기화를 한 번만 수행하십시오 (앱 종료시). 나는 이것을 테스트했고 오류없이 작동했다.