第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项
Posted
技术标签:
【中文标题】第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项【英文标题】:Third party dll can't find its dependencies in ASP.NET MVC project 【发布时间】:2011-10-14 22:00:20 【问题描述】:我在我的项目中使用第三方库。称它为MainLibNET.dll
。我在我的项目的References
中添加了这个库。此 dll 与其他 dll 有依赖关系。我无法在References
中添加其他 dll,因为它们是本机的。我把这个其他库放在\bin
但是当我开始我的项目时我得到了错误:
Could not load file or assembly 'MainLibNET.dll' or one of its dependencies
MainLibNET.dll 找不到它的依赖项,因为当站点启动时,服务器返回 MainLibNET.dll 不是从 \bin
而是从这里:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\e9b9d054\ddfaf4f8\assembly\dl3\8e683e03\00c3703b_919bcb01\MainLibNET.dll
除 MainLibNET.dll 外,此文件夹中没有其他文件。如果我在此文件夹中复制其他 dll,它可以正常工作。
我可以对我的项目或其他任何东西做些什么来使我的项目在不手动复制的情况下工作?
【问题讨论】:
【参考方案1】:托管程序集得到 ASP.NET 复制的影子。此过程不包括非托管库,这解释了为什么它们无法解析。一种可能性是将这些本机库添加到 c:\windows\System32\Inetsrv
文件夹中。另一种可能性是将它们放入作为PATH
环境变量一部分的文件夹中。
【讨论】:
谢谢!只有当我在 C:\Windows 中添加我的库时,它才对我有用。这里有更多关于 ASP.Net 中 C++ 程序集的信息blogs.msdn.com/b/jorman/archive/2007/08/31/…【参考方案2】:我遵循this blog 中提到的选项 2a (1c),效果很好。
在 Visual Studio 中,右键单击项目并为每个本机 DLL 添加现有项
右键单击每个添加的 DLL 并选择属性;设置构建操作 = 内容并复制到输出目录 = 始终复制。这将导致VS将文件复制到bin目录。
将以下代码添加到 Global.asax,以便 ASP.NET 知道在哪里查找本机 DLL。
.
protected void Application_Start(object sender, EventArgs e)
String _path = String.Concat(System.Environment.GetEnvironmentVariable("PATH"), ";", System.AppDomain.CurrentDomain.RelativeSearchPath);
System.Environment.SetEnvironmentVariable("PATH", _path, EnvironmentVariableTarget.Process);
【讨论】:
【参考方案3】:ASP.NET 使用shadow copying,其中:
允许在不卸载应用程序域的情况下更新应用程序域中使用的程序集。
您可以将以下项目添加到您的 Web.config 文件以禁用此沙盒功能:
<configuration>
...
<system.web>
...
<hostingEnvironment shadowCopyBinAssemblies="false" />
</system.web>
这应该允许您像加载 .NET 控制台应用程序一样加载本机 DLL。
【讨论】:
以上是关于第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项的主要内容,如果未能解决你的问题,请参考以下文章
《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造
asp.net mvc3发布(部署)问题。vs2012发布项目缺少文件夹、发布后部署在iis7上网站无法运行