【问题标题】:IIS 7.5+ 64bit having trouble loading C++ CLR dllsIIS 7.5+ 64bit 无法加载 C++ CLR dll
【发布时间】:2018-02-14 07:35:51
【问题描述】:

我的团队最近从 VS2008 升级到 VS2015。我们的项目是在混合模式 CLR 和直接非托管引用/pinvoke 下工作的 C# SDK 层和 C++ 核心库的组合。

桌面可执行文件的 VS2015 编译适用于跨多个环境的托管和非托管版本。但是,当我们在 IIS/bin 中使用相同的 .NET 驱动程序和 C++ 库时,Web 服务器无法加载使用 CLR 编译的任何 C++ dll。这在我们的开发和生产盒中都在 VS2015 内部和外部。我们可以将任何 C++ 驱动程序设置到托管 CLR 中,我们会看到失败的结果:

错误无法加载文件或程序集“ConfigAuth.DLL”或其之一 依赖关系。找不到指定的模块。

文件已明确找到,PATH 变量已检查三次。我们已经运行进程监视器来查找 dll 文件加载问题,但似乎无法找到任何可以提供有关缺失内容的线索的内容。我们过去曾遇到过缺少可再发行包的问题,​​并且读到某些组合会失败。我们已经卸载并重新安装了这些软件包,但也许我们以错误的顺序/组合进行操作?

开发箱/配置:

Windows 7、64 位环境

盒子上安装了以下 VS C++ Redistributable Packages:2012,2013,2015(均为 x86/64)

已安装 2012-2015 年的 SxS 合并模块

所有文件编译到 Win32/x86 平台

.NET 4.5 用于编译 ASP.NET WCF 服务构建以及所有 C# 托管 dll

.NET 4.0 是用于编译 C++ CLR 的 mscorlib

IIS 7.5+ 64bit 无法在 VS2015 上加载使用 2015 工具包编译的 C++ 库。

IIS 应用程序池支持 32 位程序集

IIS 应用程序池已设置所有目录和窗口访问权限以访问文件

PATH 变量已被设置并针对其他可以像非 CLR 一样正常加载的文件进行测试

【问题讨论】:

    标签: .net iis visual-c++ visual-studio-2015 clr


    【解决方案1】:

    我调试它的典型方法是分两个阶段。

    首先,我enable fusion logging 看看是否缺少任何 .Net 依赖项。任何找不到的程序集都会将日志写入指定位置。有时可能发生的情况是应用程序池将在 ASP.Net 编译期间复制程序集并且不包含依赖项。这将有助于找到它。

    其次,我运行 Dependency Walker 来获取一组本地代码所依赖的 dll,如果我无法仅通过查看集合来判断,我运行 Process Monitor 并过滤失败的 DLL 加载(路径以“.dll”结尾,结果不是“SUCCESS”)。

    【讨论】:

    • 感谢您,我们使用了这两个工具,发现较低级别的驱动程序出现故障。我们知道,如果我们在正在加载的任何驱动程序上使用 /clr 选项,IIS 将无法加载它们。如果我们关闭 /clr,它们就会加载。我很确定它正在检查 GAC 中具有 /clr 设置的驱动程序,这可以解释我们的问题。我们设置为/clr的驱动如果放到项目的Bin文件夹下肯定是编译不了的,如果放到PATH文件夹下还是加载不出来。来自 Fusion Loggin 的错误:从文件中提取清单导入时出错 (hr = 0x80131018)。
    • 它还从 bin 文件夹中找到了这个较低的库。所以,如果它正在制作卷影副本,我有点迷茫。这在 VS 2015 IDE Express IIS 和独立的 IIS 中失败。 LOG:程序集下载成功。尝试设置文件:C:\Users\kieran\Source\Repos\iTrace\2dmi\WebAPI\bin\BitShuffle.dll 日志:进入下载缓存设置阶段。 ERR:从文件中提取清单导入时出错(hr = 0x80131018)。 ERR:设置失败,hr = 0x80131018。 ERR:无法完成程序集的设置(hr = 0x80131018)。探测终止。
    • 经过更多工作和日志调查后的最新更新。许多日志输出都是失败的,但也有成功的混合,所以它可能会产生很大的误导。我能够找到导致问题的唯一驱动程序是我们的 WriteAMark.dll,我确认它是 CLR / 托管 DLL。我知道 IIS 在加载这些类型的驱动程序时遇到问题,并且听说使用 GAC 是一种选择。除了全球回购还有其他方法吗?我可以在 web.config 中做一些事情来控制这个驱动程序并将其正确加载到 IIS 中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多