2

我尝试在 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\ 文件夹中当我想发布网站时。然后,路径应该在应用程序文件夹中。

4

1 回答 1

0

我没有一对一解决问题,但成功绕过了问题:

通过使用显式 dllimport 重写 c#/c++ 包装器,我直接使用路径寻址 dll 文件。然后,依赖的 dll 只需与引用的 dll 位于同一文件夹中。这也适用于网络应用程序。

于 2016-06-20T15:48:53.900 回答