IIS 7.5+ 64位无法加载C ++ CLR dll

时间:2017-09-05 23:15:57

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

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

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

  

错误无法加载文件或程序集' ConfigAuth.DLL'或其中一个   依赖。找不到指定的模块。

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

开发框/配置:

Windows 7,64位环境

包装盒上安装了以下VS C ++可再发行组件包:2012,2013,2015(每个都是x86 / 64)

安装了2012-2015的SxS合并模块

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

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

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

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

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

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

PATH变量已经设置并针对其他文件进行了测试,这些文件加载​​得很好,因为非CLR

1 个答案:

答案 0 :(得分:2)

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

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

其次,我运行Dependency Walker以获取本机代码所依赖的一组dll,如果我只是通过查看该集合来判断,我运行Process Monitor并且过滤失败的DLL加载(路径以" .dll&#34结束;结果不是" SUCCESS")。

Procmon Filter