gpt4 book ai didi

asp.net - 具有非托管依赖项的 64 位托管程序集未在 IIS/ASP.NET MVC 4 中加载

转载 作者:行者123 更新时间:2023-12-04 20:10:51 25 4
gpt4 key购买 nike

我有一个几乎空的 ASP.NET MVC4 项目,它引用了一个 64 位托管程序集,该程序集具有一组非托管依赖项。

通过引用以正常方式引用托管程序集。

非托管依赖项在构建后事件中复制到 bin 文件夹 - 并在 Web 应用程序启动时出现(已验证)。

问题是我得到:

Could not load file or assembly 'msvcm80.DLL' or one of its dependencies. A dynamic link library (DLL) initialisation routine failed. (Exception from HRESULT: 0x8007045A)



这是非托管依赖项之一。完整列表是:
  • iconv.dll
  • lbm.dll
  • libeay32.dll
  • msvcm80.dll
  • msvcp80.dll
  • msvcr80.dll

  • 托管 dll 是针对 x64 构建的,所有依赖项也是 x64(通过使用 Dependency Walker 进行验证)。

    现在我还创建了一个空白的控制台应用程序、一个 windows 窗体应用程序和一个自托管的 Web Api,其中包含相同的代码(用于使用托管程序集启动实例)并且它们都可以正常工作(当强制构建目标为x64)。

    使用Fusion Log(先清空,再加载web app,刷新日志查看器),可以看到加载有问题:
  • iconv.dll
  • libeay32.dll
  • lbm.dll

  • 他们都有类似的日志文件:
    LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3b2d5b3e/b1b5f1f5/iconv.DLL.
    LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3b2d5b3e/b1b5f1f5/iconv/iconv.DLL.
    LOG: Attempting download of new URL file:///C:/.../bin/iconv.DLL.
    LOG: Assembly download was successful. Attempting setup of file: C:\...\bin\iconv.dll
    LOG: Entering download cache setup phase.
    ERR: Error extracting manifest import from file (hr = 0x80131018).
    ERR: Setup failed with hr = 0x80131018.
    ERR: Failed to complete setup of assembly (hr = 0x80131018). Probing terminated.

    所以它实际上确定依赖项在本地 bin 文件夹中,但由于某种原因无法使用它们。

    错误“从文件中提取 list 导入时出错(hr = 0x80131018)”是什么意思。意思?

    依赖项不在 GAC 中,也没有使用 regsvr32(不是 COM)注册。

    让我感到困惑的是,它在 IIS 之外运行良好(我什至尝试将应用程序池上的凭据设置为与本地网络凭据相同——当然,这并没有什么区别)。

    有关如何调试此问题的任何好主意?

    编辑 :
    我现在可以在本地开发人员机器上运行 ASP.NET 站点,但是 不是 当它部署到另一台服务器上时。

    我的本地机器的“修复”是从 bin 目录中删除 msvcm80.dll(C 运行时)。该程序集(可能)仍然需要,但在其他地方查找(大概是因为我在 WinSxS 中安装了“正确”版本的 CRT(可分发))。

    深入研究,我发现托管程序集据称依赖于 msvcm80.dll 版本 8.00.50727.6195 (x64),但该特定版本未安装在我的本地系统上(我只将它放在依赖文件夹中) - 但我确实这样做了在 WinSxs (8.00.50727.6910) 中有一个更新的。

    那么当不直接在 bin 文件夹中添加它时,IIS 会选择哪一个?

    第二次编辑 :
    所以看起来 lbm.dll 直接依赖于 msvcr80.dll,但它也依赖于 iconv.dll,而 iconv.dll 又依赖于 msvcr80.dll。但是,根据 Dependency Walker (depends.exe),这两个依赖项不会从同一目录解析(即使它们具有相同的版本!)。

    如果我确保间接依赖项在 PATH 环境变量中,而第二个依赖项在 WinSxS 中,则它可以工作。这显然不够好,但我无法弄清楚如何强制从单个位置/文件加载直接和间接依赖项。

    最佳答案

    使用类似 Dependency Walker 的工具你会发现lbm.dll并且它的依赖只依赖于 msvcr80.dll而不是 msvcp80.dllmsvcm80.dll即使这两个文件包含在 Microsoft.VC80.CRT.manifest 中由 lbm.dll 使用加载正确版本的 Visual C++ 2005 运行时库。

    删除 msvcp80.dllmsvcm80.dll从您的 bin 文件夹中应该可以解决您的问题。

    关于asp.net - 具有非托管依赖项的 64 位托管程序集未在 IIS/ASP.NET MVC 4 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447391/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com