无法为一个网站而不是另一个复制的网站加载 dll 错误,这两个网站都托管在同一个 IIS 7.0 上

unable to load dll error shown for one website and not the other copied website, both hosted on same IIS 7.0

我有一个第 3 方 dll,当它在我的本地 VS 中使用时运行完美,没有任何问题。这个第 3 方 dll 带有 32 位和 64 位 dll 安装文件。我 运行 64 位安装程序和 system32 文件夹具有所需的 dll。我的本地项目调用这些 dll 没有问题。

当我尝试以相同的步骤在 64 位 windows 2012 R2 测试服务器上的 IIS 7.0 上托管网站时,出现以下错误: 无法加载 DLL“3rdparty.dll”:找不到指定的模块。 (HRESULT 异常:0x8007007E)

为了解决这个问题,我尝试卸载 64 位并安装 32 位 dll,而 SysWow64 有所需的 dll,并且没有收到错误。

我检查了 system32 是否有那些 dll,但有 none 并且只有 syswow64 有 dll。谁能告诉我为什么 32 位 dll 在服务器上工作而 64 位在我的本地工作?

另外,在不同的机器上尝试时,我发现 32 位安装程序在所有机器上都能正常工作,但 64 位在某些机器上有问题。

添加到这个 st运行geness,当我在不同的文件夹中托管同一网站的副本时,但是在测试服务器上的 IIS 7.0 的相同应用程序池下。我在一个网站上收到错误,而另一个网站在加载所需的 dll 时没有问题。这两个网站在 IIS 用户使用方面完全相同,访问权限唯一不同的是它们位于不同的文件夹结构下。

还有什么方法可以引用第 3 方 dll 以使用特定路径而不是信任网站项目中的 system32 和 syswow64 文件夹。

正如 Cyril 所提到的,我使用 Procmon 来跟踪 asp.net 网站在何处寻找第 3 方 dll。检查时发现第 3 方 dll 正在查看 SysWow64 文件夹,而不是预期的 System32 文件夹。发生这种情况是因为复制之前的网站是在 32 位版本上编译的,因此复制的版本正在寻找 32 位而不是 64 位。这使它的行为有所不同。但是,我需要了解 .net 编译器如何决定使用哪个版本来弄清我所遇到的这种困惑。

以下问题也有帮助:Dll in both the bin and the gac, which one gets used?