Ошибка «модуль не найден» в компоненте C ++ / CLI в ASP.NET

Я должен включить (управляемый) компонент C ++ / CLI в один из моих проектов ASP.NET, который ссылается на другой (неуправляемый) C ++ DLL. Проблем быть не должно - .NET 3.5 доволен компиляцией проекта, вроде все нормально. Компонент C ++ / CLI и другие библиотеки DLL C ++ скомпилированы другим отделом как версия Release с «Any CPU» в Visual Studio 2005. Установлен распространяемый пакет VC ++ 2005. И тот же код работает без проблем, когда я запускаю его внутри обычного консольного приложения .NET.

Теперь, хотя этот код работает в консольном приложении, он некорректно размещается в ASP.NET - он приводит к ошибке при начальной загрузке страницы (даже до перехода в Global.asax). Для тестирования и отладки я использовал две конфигурации компьютера:

  1. Локальный компьютер разработчика : Windows XP, 32-разрядная версия, VC ++ 2005 Redist Package, Visual Studio 2010, ASP.NET 3.5, компиляция «Любой процессор», хостинг в Сервер веб-разработки (Cassini)
  2. Тестовый сервер (целевая машина): Windows 7, 64-разрядная версия, пакет VC ++ 2005 Redist, хостинг в IIS 7, для AppPool установлен параметр «Включить 32-разрядные приложения»

На обеих машинах возникает одна и та же следующая ошибка когда я запускаю приложение ASP.NET:

Exception Details: System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)

Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:
[FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +127
 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +142
 System.Reflection.Assembly.Load(String assemblyString) +28
 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +613
 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +203
 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +105
 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178
 System.Web.Compilation.WebDirectoryBatchCompiler..ctor(VirtualDirectory vdir) +163
 System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(VirtualDirectory vdir, Boolean ignoreErrors) +53
 System.Web.Compilation.BuildManager.BatchCompileWebDirectory(VirtualDirectory vdir, VirtualPath virtualDir, Boolean ignoreErrors) +175
 System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) +86
 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +261
 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +101
 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +126
 System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +62
 System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +33
 System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +40
 System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +160
 System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +93
 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Это странно ... Здесь ничего не говорится о какой сборке не хватает, даже Fuslogvw.exe или sxstrace.exe ничего не регистрируют. Более того, похоже, что ошибка зависит от сборки C ++ / CLI или от неуправляемых DLL C ++. Если я удалю ссылку на сборку C ++ / CLI из моего проекта ASP.NET и кода, он будет работать нормально. Теперь, поскольку сборка C ++ / CLI зависит от собственных библиотек DLL C ++, на которые нет ссылок в проекте ASP.NET, я скопировал все зависимые библиотеки DLL C ++ в папку «bin» выходной папки проекта ASP.NET (так же, как для рабочей консоли. применение). Хотя все материалы C ++ были скомпилированы в режиме выпуска, с установленным правильным пакетом VC ++ Redist Package должны быть все зависимости. Конечно, я знаю, что существует FileNotFoundException , но я не могу понять, чего не хватает ...

Как сказано: тот же код для доступа к компоненту C ++ / CLI работает в консольном приложении .NET 3.5 на оба тестовых ПК (на которых у меня развернуты одинаковые зависимости) с одинаковыми зависимыми библиотеками DLL C ++, развернутыми в выходной папке, только в ASP.NET я получаю указанную выше ошибку.

Есть предложения, как я могу избавиться от проблемы или как я могу отслеживать ее дальше?

(Конечно, я искал проблему в StackOverflow и Google, например, я нашел эти ссылки, но они не помогли:
- Ошибка «Указанный модуль не найден» при запуске веб-службы C # ASP.NET со ссылкой на C ++ dll
- Доступ к x86 COM из x64 .NET
- ASP Приложение .NET, разработанное в 32-битной среде, не работает в 64-битной среде
- Модуль не найден Исключение из .NET 2.0 в Windows Server 2008 R2 )

9
задан Community 23 May 2017 в 12:16
поделиться