我在项目中使用第三方库。称之为MainLibNET.dll
。我在我项目的References
中添加了这个库。这个DLL与其他dll有依赖关系。我无法在References
添加其他dll,因为它们是原生的。我将其他库放在\bin
中但是当我启动项目时出现错误:
Could not load file or assembly 'MainLibNET.dll' or one of its dependencies
MainLibNET.dll无法找到其依赖项,因为当站点启动时,服务器不会从\bin
返回MainLibNET.dll,而是从此处返回:
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它工作正常。
我可以用我的项目或其他任何方法来使我的项目无需手工复制?
答案 0 :(得分:1)
托管程序集由ASP.NET复制阴影。此过程不包括非托管库,这解释了无法解决的原因。一种可能性是将这些本机库添加到c:\windows\System32\Inetsrv
文件夹中。另一种可能性是将它们放入一个文件夹,该文件夹是PATH
环境变量的一部分。
答案 1 :(得分:0)
我按照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);
}
答案 2 :(得分:0)
ASP.NET使用shadow copying,其中:
允许在不卸载应用程序域的情况下更新在应用程序域中使用的程序集。
您可以将以下项目添加到Web.config文件中以禁用此沙箱功能:
<configuration>
...
<system.web>
...
<hostingEnvironment shadowCopyBinAssemblies="false" />
</system.web>
这应该允许您像加载.NET控制台应用程序一样加载本机DLL。