Visual Studio 2010 — loadFromRemoteSources в проекте C ++

Я создал C ++ DLL (она должна быть на C ++), которая динамически связывает .Net DLL для размещения сервера веб-служб. .Net DLL передает вызовы веб-службы в C ++ DLL, которая также оценивается и отвечает через .Net DLL.

Что-то вроде того:

     HSPWebService.DLL
-----------------------------------
HSPProxy.DLL | HSPWebServiceLib.DLL
-----------------------------------
HSPSendData.DLL
  • HSPWebService.DLL — правильная C ++ DLL.
  • HSPProxy.DLL — прокси, сгенерированный компилятором MIDL через интерфейс HSP.DLL MIDL.
  • HSPWebServiceLib.DLL — typelib, сгенерированный tlmbimp через HSP.DLL.
  • HSPSendData.DLL — .Net DLL, в которой размещается сервер веб-службы

Все работает как шарм. Проблема в том, что файлы DLL находятся в общем сетевом ресурсе (// myPc / share). Мой журнал приложений показывает ошибку 0x80131515:

CreateAssemblyInstance ОШИБКА: не удалось создать экземпляр сборки. (Ч = 80131515)

В своих исследованиях я обнаружил, что ошибка 0x80131515 возникает из-за того, что .Net Framework по умолчанию не загружает сборки из внешних источников. Для проектов .Net эта опция может быть установлена ​​в настройках проекта. Но у меня есть проект C ++ в Visual Studio 2010, и я понятия не имею, как использовать эту конфигурацию в моем проекте (или в моем коде). Есть идеи?

Функция CreateAssemblyInstance:

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:

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

Решение

Учитывая, что ваши сборки расположены в общей сетевой папке, вам необходимо добавить <loadFromRemoteSources> элемент в ваш файл app.config. Например:

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

Вы не упоминаете ваш хост-процесс, но при условии, что это MyService.exe, он будет помещен в файл MyService.exe.config.

0

Другие решения

Aparently Обновления .NET решили эту проблему. Я пытался отследить, какое обновление было сделано, но я не смог его найти.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector