BadImageFormatException при использовании собственных DLL из ASP.NET - PullRequest
1 голос
/ 16 сентября 2010

Привет Iam ссылается в моем приложении ASP.NET на управляемый проект C ++, который использует собственную dll с именем "libmmd.dll". Если я запускаю приложение ASP.NET с Visual Studio, я получаю исключение BadImageFormatException, которое сообщает мне, что «модуль должен содержать манифест сборки» (перевод с немецкого).

Каков предпочтительный способ включения собственных dll в проекты asp.net? В каком каталоге искать? В пути «C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files», похоже, находятся только управляемые сборки, а не собственные библиотеки DLL.

[FileNotFoundException: Das angegebene Modul wurde nicht gefunden. (Ausnahme von 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: Das angegebene Modul wurde nicht gefunden. (Ausnahme von 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.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +54
   System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp) +227
   System.Web.Compilation.BuildManager.CompileGlobalAsax() +52
   System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +337

[HttpException (0x80004005): Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E)]
   System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() +58
   System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +512
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E)]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8890751
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +85
   System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +259

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Убедитесь, что разрядность вашего приложения ASP.NET (это устанавливается пулом приложений IIS) соответствует разрядности собственной библиотеки DLL. Например. 32-битный процесс не может загрузить 64-битную DLL.


Дополнительно: codymanix прокомментировал:

Мой компьютер 32-битный, также все Dll. Библиотека работала в приложении Windows Forms, когда я поместил DLL в папку приложения. Но в ASP.NET я не знаю, в какую папку поместить DLL.

Самый простой способ получить dll в нужном месте - позволить VS / ASP.NET сделать это одним из следующих способов:

  • Для ссылки на проект установите для параметра «Копировать локальный» значение true.
  • Добавьте dll в проект с действием сборки none и скопируйте в папку назначения.
  • Добавьте dll к проекту в его папке bin.

Я бы начал с последнего варианта, но также проверил с помощью Process Monitor , чтобы увидеть, откуда Windows пытается загрузить dll (то есть, какие папки веб-приложений включены в путь загрузки). Взаимодействие между нативной и управляемой сборками может быть немного сложным (из-за различных правил поиска загрузчика), ASP.NET добавляет свои собственные различия, которые в некоторой степени применяются к нативным библиотекам.

0 голосов
/ 20 сентября 2010

Я не установил переменную Windows% PATH% для включения пути к моим собственным DLL, и теперь он работает.

Мне также пришлось перезагрузить компьютер, чтобы запустить его.

...