Visual Studio 2015 не находит внешние.dll даже после копирования в папку bin, но только после копирования в папку c:\Windows\
Я пытаюсь создать Web-проект в Visual Studio 2015, который ссылается на aC# .dll-проект "dotnetWrapper", который является оболочкой aC# для проекта C++ "managedDllWrapper", который включает в себя некоторые сторонние 64-битные собственные C++ .dll.
Упомянутые проекты и веб-проект работают на.Net Framework 4.6.1 и x64. VS2015 использует iis express 64 bit.
Все компилируется нормально.
Когда я запускаю локальный веб-сервер в VS2015 (нажимаю зеленую кнопку запуска), я получаю сообщение об ошибке, что "managedDllWrapper.dll" или одна из его зависимостей не может быть найдена:
Ошибка сервера в приложении '/'
Не удалось загрузить файл или сборку managedDllWrapper.DLL или одну из ее зависимостей. Указанный модуль не может быть найден.
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.IO.FileNotFoundException: не удалось загрузить файл или сборку managedDllWrapper.DLL или одну из ее зависимостей. Указанный модуль не может быть найден.
Ошибка источника:
Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.
Трассировки стека:
[FileNotFoundException: не удалось загрузить файл или сборку managedDllWrapper.DLL или одну из их зависимостей. Указанный модуль не может быть найден.] System.Reflection.RuntimeAssembly._nLoad(имя_файла AssemblyName, строка stringBase, доказательство AssemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое throwOnFileNectionSecleNessleSecleNessalSecenseSecureSecureNectionSeclement) BooleNecureSecenseSecuritySound)
System.Reflection.
System.Reflection.RuntimeAssembly.InternalLoad (String assemblyString, Доказательства ассемблирования Security, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Логическое значение для интроспекции) +108
System.Reflection.RuntimeAssembly.InternalLoad (строка String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +25
System.Reflection.Assembly.Load (String assemblyString) +34 System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +49
[ConfigurationErrorsException: не удалось загрузить файл или сборку managedDllWrapper.DLL или одну из их зависимостей. Указанный модуль не может быть найден.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +772
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +259
System.Web.Configuration.CompilationSection.LoadAssembly (AssemblyInfo ai) +163
System.Web.Compilation.<> C.b__143_0 (AssemblyInfo ai) +29
System.Linq.d__16'2.MoveNext () +293
System.Linq.d__66'1.MoveNext () +100
System.Linq.d__63'1.MoveNext () +73
System.Web.UI.Util.GetTypeFromAssemblies (IEnumerable сборок, String typeName, Boolean ignoreCase) +217
System.Web.Compilation.BuildManager.GetType (String typeName, Boolean throwOnError, Boolean ignoreCase) +266
System.Web.Configuration.HandlerFactoryCache.GetTypeWithAssert (тип String) +48
System.Web.Configuration.HandlerFactoryCache.GetHandlerType (String type) +17
System.Web.Configuration.HandlerFactoryCache..ctor (тип String) +25
System.Web.HttpApplication.GetFactory (тип String) +104
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +262
System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логический и завершен синхронно) +137
Информация о версии: Microsoft .NET Framework Версия:4.0.30319; ASP.NET версия:4.6.1055.0
Обратите внимание, что собственные dll (зависимости) находятся в папке bin веб-проекта (скопировано вручную).
Когда я копирую нативные библиотеки в свою папку C:\Windows\, веб-приложение работает без сбоев. Каким-то образом путь поиска DLL в веб-приложении указывает только на папку C:\Windows\, но он также должен искать в папке выполнения (bin) веб-приложения, верно?
Когда я делаю не веб-приложение, а тестовое приложение консоли C#, которое также включает в себя оболочку со всеми dll, копирование dll в папку bin test-app работает нормально, и приложение запускается. Только веб-приложение имеет эту проблему, чтобы не принимать DLL-файлы в папке bin.
Кроме того, когда я копирую dll в каталог C:\Windows\ и запускаю веб-приложение, а затем снова пытаюсь удалить dll, он говорит, что их нельзя удалить, потому что
потому что файл открыт в IIS Express Worker Process.
Так что, возможно, это проблема IIS, а не VS2015, но я не могу настроить свой IIS (или я не знаю, как). Я использую IIS Express, который поставляется с Visual Studio 2015.
Все мои исследования в Google и stackru привели к:
- скопировать dll в папку bin (пробовал, но не работает, как описано выше, работает только для консольного приложения C#, но не для веб-приложения).
- Ссылка dlls прямо в проекте (не представляется возможным:)
"[..]. dll не может быть добавлено. Пожалуйста, убедитесь, что файл доступен, и что это допустимая сборка или COM-компонент."
- проверьте, все ли 64-битное, и ту же версию.Net (проверено, 64-битное,.Net 4.6.1. Также: оно отлично работает для консольного приложения, но не для веб-приложения).
- измените файл web.config, чтобы добавить дополнительные папки.dll. Но это тоже не помогло.
Я был бы рад, если бы мой веб-проект мог найти.dll в папке, отличной от C:\Windows\, так как я сомневаюсь, что мне будет разрешено добавить 17 .dll в папку C:\Windows\ на MS azurewebsites когда я хочу опубликовать сайт. Тогда путь должен быть как-то внутри папок приложения.
1 ответ
Я не решил проблему один на один, но я успешно обошел проблему:
Переписав оболочку C#/ C++ с явным dllimport, я обратился к файлам dll напрямую с помощью пути. Затем зависимая DLL просто должна быть в той же папке, что и указанная DLL. Это работает также в веб-приложениях.