我尝试在 Visual Studio 2015 中构建一个 Web 项目,它引用 ac# .dll-project "dotnetWrapper",它是一个 c++ 项目 "managedDllWrapper" 的 ac# 包装器,其中包括一些第 3 方 64 位本机 c++ .dll。
引用的项目和 Web 项目在 .Net Framework 4.6.1 和 x64 上运行。VS2015 使用 iis express 64 位。
一切都编译得很好。
当我在 VS2015 中启动本地网络服务器(点击绿色开始按钮)时,我收到错误消息,指出找不到“managedDllWrapper.dll”或其依赖项之一:
“/”应用程序中的服务器错误。
无法加载文件或程序集“managedDllWrapper.DLL”或其依赖项之一。指定的模块无法找到。
说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.IO.FileNotFoundException:无法加载文件或程序集“managedDllWrapper.DLL”或其依赖项之一。指定的模块无法找到。
源错误:
在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
堆栈跟踪:
[FileNotFoundException:无法加载文件或程序集“managedDllWrapper.DLL”或其依赖项之一。找不到指定的模块。] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据 assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 throwOnFileNotFound,布尔 forIntrospection,布尔 suppressSecurityChecks)+234
System.Reflection.RuntimeAssembly.InternalLoad(字符串 assemblyString,证据 assemblySecurity,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,Boolean forIntrospection)+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 程序集,字符串类型名,布尔忽略大小写)+217
System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +266
System.Web.Configuration.HandlerFactoryCache.GetTypeWithAssert(字符串类型)+48
System.Web.Configuration.HandlerFactoryCache.GetHandlerType(字符串类型)+17
System.Web.Configuration.HandlerFactoryCache..ctor(字符串类型)+25
System.Web.HttpApplication.GetFactory(字符串类型)+104
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +262
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +137
版本信息:Microsoft .NET Framework 版本:4.0.30319;ASP.NET 版本:4.6.1055.0
请注意,本机 dll(依赖项)位于 web-project bin 文件夹中(手动复制)。
当我将本机 dll 复制到我的 C:\Windows\ 文件夹中时,Web 应用程序运行顺畅且良好。不知何故,网络应用程序的 dll 搜索路径仅指向 C:\Windows\ 文件夹,但它也应该查看 webapp 执行 (bin) 文件夹,对吗?
当我不做 web 应用程序,而是一个 C# 控制台测试应用程序时,它还包括所有 dll 的包装器,将 dll 复制到 test-app bin 文件夹中工作正常并且应用程序运行。只有 web 应用程序有这个问题,不接受其 bin 文件夹中的 dll。
此外,当我将 dll 复制到 C:\Windows\ 目录并运行 Web 应用程序,然后再次尝试删除 dll 时,它说它们无法删除,因为
因为该文件在 IIS Express 工作进程中打开。
所以,也许这是 IIS 的问题,而不是 VS2015 的问题,但我无法配置我的 IIS(或者我不知道如何配置)。我使用 Visual Studio 2015 附带的 IIS express。
我在 Google 和 stackoverflow 上的所有研究结果:
- 将 dll 复制到 bin 文件夹(已尝试,但如上所述不起作用,仅适用于 C# 控制台应用程序,不适用于 Web 应用程序)。
- 直接在项目中引用 dll(不可能:)
“无法添加 [..].dll。请确保该文件可访问,并且它是有效的程序集或 COM 组件。”
- 检查所有内容是否为 64 位,以及相同的 .Net 版本(已检查,64 位,.Net 4.6.1。另外:它适用于控制台应用程序,但不适用于 Web 应用程序)。
- 更改 web.config 以添加更多 .dll 文件夹。但这也无济于事。
如果我的网络项目可以在与 C:\Windows\ 不同的文件夹中找到 .dll ,我会很高兴,因为我怀疑是否允许我将 17 个 .dll 添加到 MS azurewebsites 上的 C:\Windows\ 文件夹中当我想发布网站时。然后,路径应该在应用程序文件夹中。