非托管DLL无法加载到ASP.NET服务器上

这个问题涉及一个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位于网站的bin目录中,以及包含它们的托管DLL以及网站的所有其他DLL。

搜索这个问题揭示了很多其他人似乎都有访问来自ASP.NET网站的外部非.NET DLL的相同问题,但我还没有找到可行的解决方案。

我已经尝试了以下内容:

  • 运行DEPENDS检查依赖关系,以确定前三个位于路径中的System32目录中,最后一个位于.NET 2框架中。
  • 我把这两个DLL及其依赖关系放在System32中,并重新启动服务器,但网站仍然无法加载这些外部DLL。
  • 将ASPNET,IIS_WPG和IUSR(针对该服务器)的完整权限授予网站bin目录并重新启动,但网站仍无法加载这些外部DLL。
  • 将外部DLL作为现有项目添加到项目中,并将其“复制到输出”属性设置为“始终复制”,并且网站仍无法找到这些DLL。
  • 同时将他们的“Build Action”属性设置为“Embedded resource”,网站仍然无法找到DLL。
  • 任何援助这个问题将不胜感激!


    尝试将dll放在 System32 Inetsrv目录中。 这是Windows Server上IIS的工作目录。

    如果这不起作用,请尝试将dll放在System32目录和Inetsrv目录中的依赖项文件中。


    发生这种情况是因为受管dll将阴影复制到.NET Framework目录下的临时位置。 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms366723.aspx。

    不幸的是,非托管dll不会被复制,并且ASP.NET进程无法在需要加载它们时找到它们。

    一个简单的解决方案是将非托管dll放入系统路径中的目录(在命令行键入“path”以查看计算机上的路径),以便可以通过ASP.NET进程找到它们。 System32目录始终位于路径中,因此将非托管dll始终可用,但我建议将其他文件夹添加到路径中,然后在其中添加dll以防止污染System32目录。 这种方法的一大缺点是你必须重命名你的应用程序的每个版本的非托管dll,你可以很快拥有你自己的dll地狱。


    作为将dll放入路径中的文件夹的替代方法(如system32),您可以使用以下代码更改流程中的路径值

    System.Environment.SetEnvironmentVariable("Path", searchPath + ";" + oldPath)
    

    然后当LoadLibrary试图找到非托管DLL时,它也会扫描searchPath。 这可能比在System32或其他文件夹中弄得乱七八糟。

    链接地址: http://www.djcxy.com/p/44529.html

    上一篇: Unmanaged DLLs fail to load on ASP.NET server

    下一篇: "Cannot Import dll" when importing C# DLL in Inno Setup