2013-12-09 82 views
0

我已經創建了一個C++ DLL(它必須在C++中),它可以將一個.Net DLL鏈接到一個Web服務服務器。 .Net DLL將Web服務調用傳遞給C++ DLL,並通過.Net DLL進行評估和響應。loadFromRemoteSources在一個C++項目

類似的東西:

 HSPWebService.DLL 
----------------------------------- 
HSPProxy.DLL | HSPWebServiceLib.DLL 
----------------------------------- 
     HSPSendData.DLL 
  • HSPWebService.DLL - 正確的C++ DLL。
  • HSPProxy.DLL - 由MIDL編譯器通過HSP.DLL MIDL接口生成的代理。
  • HSPWebServiceLib.DLL - 通過HSP.DLL由tlmbimp生成的typelib。
  • HSPSendData.DLL - NET的DLL它承載Web服務的服務器

一切工作就像一個魅力。問題是當DLL文件在網絡共享中時(// myPc/share)。我的應用程序日誌顯示錯誤0x80131515:

CreateAssemblyInstance錯誤:無法創建程序集實例。 (hr = 80131515)

在我的研究中,我發現0x80131515錯誤是因爲.Net框架默認不會從外部來源加載程序集。對於.Net項目,該選項可以設置爲項目設置。但是我在Visual Studio 2010上有一個C++項目,我不知道如何在我的項目(或者我的代碼)上使用這個配置。有任何想法嗎?

的CreateAssemblyInstance功能:

HRESULT CHSPWebServiceObjectHost::StartCLR(CComPtr<ICorRuntimeHost>& spRuntimeHost, CComPtr<IDispatch>& spDispHost) const 
{ 
    spRuntimeHost = NULL; 
    spDispHost = NULL; 

    //Retrieve a pointer to the ICorRuntimeHost interface 
    HRESULT hr = CorBindToRuntimeEx(L"v4.0.30319", 
            L"wks", 
            STARTUP_LOADER_SAFEMODE | STARTUP_CONCURRENT_GC, 
            CLSID_CorRuntimeHost, 
            IID_ICorRuntimeHost, 
            (void**)&spRuntimeHost); 

    if (FAILED(hr)) 
    { 
    Log(logDriver, _T("CHSPWebServiceObjectHost::StartCLR ERROR: Could not load CLR into unmanaged host process. ( hr=%08X)"), hr);  
    return hr;  
    }  

    //Start the CLR 
    hr = spRuntimeHost->Start(); 
    if (FAILED(hr)) 
    { 
    Log(logDriver, _T("CHSPWebServiceObjectHost::StartCLR ERROR: Could not start CLR. (hr=%08X)"), hr); 
    return hr; 
    } 

    //Retrieve the IUnknown default AppDomain 
    CComPtr<IUnknown> spUnknown; 
    hr = spRuntimeHost->GetDefaultDomain(&spUnknown); 
    if (FAILED(hr)) 
    { 
    Log(logDriver, _T("CHSPWebServiceObjectHost::StartCLR ERROR: Could not retrieve pointer to domain interface. ( hr=%08X)"), hr);  
    return hr;  
    }  

    CComQIPtr<_AppDomain> spDefAppDomain(spUnknown); 
    if (spDefAppDomain == NULL) 
    return E_NOINTERFACE; 

    CString strAssemblyFullPath = _T(".\\HSPSendData.dll"); 

    return CreateAssemblyInstance(spDefAppDomain, spDispHost, strAssemblyFullPath, _T("Elipse.HSPWebService. HSPWebServiceHost"));  
}  
+0

注意:'CorBindToRuntimeEx' [已棄用](http://msdn.microsoft.com/zh-cn/library/99sz37yh(v = vs.100).aspx)。請參閱[將公共語言運行時加載到進程中](http://msdn.microsoft.com/zh-cn/library/01918c6x(VS.100).aspx)。 –

回答

0

Aparently .NET更新已解決此問題。我試圖回溯哪些更新已完成,但我無法找到它。

0

鑑於您的組件位於網絡共享,您可以:

HRESULT CHSPWebServiceObjectHost::CreateAssemblyInstance(_AppDomain* pDefAppDomain, CComPtr<IDispatch>& spDisp, LPCTSTR pszAsseblyName, LPCTSTR pszClassNameWithNamespace) const 
{ 
    spDisp = NULL; 
    REQUIRE_IN_POINTER(pDefAppDomain); 
    try 
    { 
    _bstr_t _bstrAssemblyName(pszAsseblyName); 
    _bstr_t _bstrszClassNameWithNamespace(pszClassNameWithNamespace); 
    //Creates an Assembly instance 
    CComPtr<_ObjectHandle> spObjectHandle; 
    HRESULT hr = pDefAppDomain->CreateInstanceFrom(_bstrAssemblyName, _bstrszClassNameWithNamespace, &spObjectHandle); 
    if (FAILED(hr)) 
    { 
     Log(logDriver, _T("CHSPWebServiceObjectHost::CreateAssemblyInstance ERROR: Could not create an assembly instance. (hr=%08X)"), hr); 
     return hr; 
    } 

    CComVariant VntUnwrapped; 
    hr = spObjectHandle->Unwrap(&VntUnwrapped); 
    if (FAILED(hr)) 
    { 
     Log(logDriver, _T("CHSPWebServiceObjectHost::CreateAssemblyInstance ERROR: Could not unwrap assembly object. (hr=%08X)"), hr); 
     return hr; 
    } 

    spDisp = VntUnwrapped.pdispVal; 
    } 
    catch (_com_error& e) 
    { 
    return e.Error(); 
    } 
    return S_OK; 
} 

它是由StartCLR函數調用需要爲您的應用添加一個<loadFromRemoteSources>元素。配置文件。例如:

<configuration> 
    <runtime> 
     <loadFromRemoteSources enabled="true"/> 
    </runtime> 
</configuration> 

你沒有提到你的主機進程,但假設它是MyService.exe,這將進入文件MyService.exe.config。

+0

對不起,根據我們的產品架構,此選項不可行。 – Taschetto