这个问题涉及一个 ASP.NET 网站,最初是在 VS 2005 中开发的,现在是在 VS 2008 中开发的。
该网站使用两个非托管外部 DLL,它们不是 .NET,我没有编译它们的源代码,必须按原样使用它们。
该网站在 Visual Studio 中运行良好,可以正确定位和访问这些外部 DLL。但是,当网站发布在网络服务器(运行 IIS6 和 ASP.NET 2.0)而不是开发 PC 上时,它无法找到和访问这些外部 DLL,并且出现以下错误:
Unable to load DLL 'XYZ.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
外部 DLL 以及包装它们的托管 DLL 以及网站的所有其他 DLL 位于网站的 bin 目录中。
搜索这个问题发现许多其他人似乎在从 ASP.NET 网站访问外部非 .NET DLL 时遇到同样的问题,但我还没有找到有效的解决方案。
我已经尝试过以下方法:
- 运行 DEPENDS 检查依赖关系以确定前三个
都在路径中的System32目录中,最后一个在.NET 2中
框架。
- 我将这两个DLL及其依赖项放入
System32并重新启动服务器,但网站仍然存在
无法加载这些外部 DLL。
- 授予 ASPNET、IIS_WPG 和 IUSR(针对该服务器)的完全权限
网站bin目录并重新启动,但网站仍然无法
加载这些外部 DLL。
- 将外部 DLL 作为现有项目添加到项目中并设置
将其“复制到输出”属性更改为“始终复制”,以及网站
仍然找不到DLL。
- 还将其“构建操作”属性设置为“嵌入式资源”并
网站仍然找不到 DLL。
任何有关此问题的帮助将不胜感激!
发生这种情况是因为托管 dll 被卷影复制到 .NET Framework 目录下的临时位置。看http://msdn.microsoft.com/en-us/library/ms366723.aspx了解详情。
不幸的是,非托管 dll 不会被复制,并且 ASP.NET 进程在需要加载它们时将无法找到它们。
一种简单的解决方案是将非托管 dll 放在系统路径中的目录中(在命令行中键入“path”以查看计算机上的路径),以便 ASP.NET 进程可以找到它们。 System32目录是always在路径中,因此将非托管 dll 放在那里总是可行的,但我建议将其他文件夹添加到路径中,然后在那里添加 dll 以防止污染 System32 目录。此方法的一大缺点是您必须为应用程序的每个版本重命名非托管 dll,并且您可以快速拥有自己的 dll 地狱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)