IIS 7.5+ 64 位加载 C++ CLR dll 时遇到问题
IIS 7.5+ 64bit having trouble loading C++ CLR dlls
我的团队最近从 VS2008 升级到 VS2015。我们的项目是 C# SDK 层和在混合模式 CLR 和直接非托管模式下工作的 C++ 核心库的组合 references/pinvoke。
桌面可执行文件的 VS2015 编译适用于跨多个环境的托管和非托管版本。但是,当我们在 IIS/bin 中使用相同的 .NET 驱动程序和 C++ 库时,Web 服务器无法加载任何使用 CLR 编译的 C++ dll。这在 VS2015 之内,在我们的开发和生产箱之外。我们可以将任何 C++ 驱动程序设置为托管 CLR,我们看到失败的结果:
Error Could not load file or assembly 'ConfigAuth.DLL' or one of its
dependencies. The specified module could not be found.
文件很清楚,PATH变量三重检查。我们有 运行 进程监视器来查找 dll 文件加载问题,但似乎无法找到任何可以提供缺失内容线索的信息。我们过去曾遇到过缺少可再发行软件包的问题,并了解到某些组合会失败。我们已经卸载并重新安装了这些软件包,但也许我们做错了 sequence/combination?
开发箱/配置:
Windows7、64bit环境
盒子上安装了以下 VS C++ 可再发行组件包: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+ 64 位无法加载在 VS2015 上使用 2015 工具包编译的 C++ 库。
IIS 应用程序池支持 32 位程序集
IIS 应用程序池已设置所有目录和 windows 访问权限以访问文件
已设置 PATH 变量并针对其他文件进行测试,这些文件可以像非 CLR 一样正常加载
我调试它的典型方法是分两个阶段。
首先,我 enable fusion logging 查看是否缺少任何 .Net 依赖项。找不到的任何程序集都会将日志写入指定位置。有时会发生的情况是,应用程序池会在 ASP.Net 编译期间隐藏副本程序集,并且不包含依赖项。这将有助于找到它。
其次,我 运行 Dependency Walker to get a set of dlls that are depended on by native code, and if I can't tell by just looking at the set, I run Process Monitor 并过滤失败的 DLL 加载(路径以“.dll”结尾且结果不是 "SUCCESS")。
我的团队最近从 VS2008 升级到 VS2015。我们的项目是 C# SDK 层和在混合模式 CLR 和直接非托管模式下工作的 C++ 核心库的组合 references/pinvoke。
桌面可执行文件的 VS2015 编译适用于跨多个环境的托管和非托管版本。但是,当我们在 IIS/bin 中使用相同的 .NET 驱动程序和 C++ 库时,Web 服务器无法加载任何使用 CLR 编译的 C++ dll。这在 VS2015 之内,在我们的开发和生产箱之外。我们可以将任何 C++ 驱动程序设置为托管 CLR,我们看到失败的结果:
Error Could not load file or assembly 'ConfigAuth.DLL' or one of its dependencies. The specified module could not be found.
文件很清楚,PATH变量三重检查。我们有 运行 进程监视器来查找 dll 文件加载问题,但似乎无法找到任何可以提供缺失内容线索的信息。我们过去曾遇到过缺少可再发行软件包的问题,并了解到某些组合会失败。我们已经卸载并重新安装了这些软件包,但也许我们做错了 sequence/combination?
开发箱/配置:
Windows7、64bit环境
盒子上安装了以下 VS C++ 可再发行组件包: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+ 64 位无法加载在 VS2015 上使用 2015 工具包编译的 C++ 库。
IIS 应用程序池支持 32 位程序集
IIS 应用程序池已设置所有目录和 windows 访问权限以访问文件
已设置 PATH 变量并针对其他文件进行测试,这些文件可以像非 CLR 一样正常加载
我调试它的典型方法是分两个阶段。
首先,我 enable fusion logging 查看是否缺少任何 .Net 依赖项。找不到的任何程序集都会将日志写入指定位置。有时会发生的情况是,应用程序池会在 ASP.Net 编译期间隐藏副本程序集,并且不包含依赖项。这将有助于找到它。
其次,我 运行 Dependency Walker to get a set of dlls that are depended on by native code, and if I can't tell by just looking at the set, I run Process Monitor 并过滤失败的 DLL 加载(路径以“.dll”结尾且结果不是 "SUCCESS")。