我的团队最近从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
答案 0 :(得分:2)
我调试它的典型方法分为两个阶段。
首先,我enable fusion logging查看是否缺少任何.Net依赖项。无法找到的任何程序集都会将日志写入指定位置。有时可能发生的情况是,应用程序池将在ASP.Net编译期间影子复制程序集,而不包括依赖项。这有助于找到它。
其次,我运行Dependency Walker以获取本机代码所依赖的一组dll,如果我只是通过查看该集合来判断,我运行Process Monitor并且过滤失败的DLL加载(路径以" .dll&#34结束;结果不是" SUCCESS")。