2017-09-05 74 views
2

我的团队最近从VS2008升级到VS2015。我们的项目是C#SDK层和C++核心库的组合,它们以混合模式CLR和直接非托管引用/ pinvoke工作。IIS 7.5+ 64位无法加载C++ CLR dlls

针对桌面可执行文件的VS2015编译在跨多个环境的托管和非托管版本中都能很好地工作。但是,当我们在IIS/bin中使用相同的.NET驱动程序和C++库时,Web服务器无法加载任何使用CLR编译的C++ dll。这是在VS2015之内,并且在我们的开发和生产箱之外。我们可以设置任何C++司机到托管CLR,我们看到了失败的结果:

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

该文件清楚地发现,PATH变量三重检查。我们运行了进程监视器来查找dll文件加载问题,并且似乎无法找到任何能够提供缺少内容的线索。过去我们遇到了缺少可重新分发包的问题,​​并且已经读过一些组合失败的问题。我们已经卸载并重新安装了这些软件包,但也许我们是在错误的顺序/组合中执行它?

发展箱/配置:

Windows 7中,64位的环境

以下VS C++可再发行的软件包被安装在盒:2012,2013,2015(均为86/64为每个)

的SxS合并2012-2015模块安装

所有文件编译成的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应用程序池已设置了访问

PATH变量已设置并针对加载就好非其他文件测试文件中的所有目录和Windows的访问权限CLR

回答

0

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

首先,我0123¾看看是否有任何.net依赖关系丢失。任何无法找到的程序集都会将日志写入指定的位置。有时可能发生的情况是应用程序池会在ASP.Net编译期间影响副本程序集,并且不包括依赖项。这将有助于找到它。

第二,我运行Dependency Walker来获得一组依赖于本机代码的dll,如果我只是看着这个集合看不清楚,我运行Process Monitor并过滤失败的DLL负载(路径以“.dll”和结果不是“SUCCESS”)。

​​

+0

感谢这一点,我们使用了这两个工具,发现一个较低级别的驱动程序失败。我们知道,如果我们在加载的任何驱动程序上使用/ clr选项,IIS将无法加载它们。如果我们关闭/ clr,它们会加载。我很确定它正在GAC中检查具有/ clr设置的驱动程序,这可以解释我们的问题。如果我们将它放到项目的Bin文件夹中,我们设置为/ clr的驱动程序肯定无法编译,如果我们将它放到PATH文件夹中,它仍然不会加载。来自Fusion Loggin的错误:从文件中提取清单导入时出错(hr = 0x80131018)。 –

+0

它也从bin文件夹中找到这个较低的lib。所以,如果它制作影子副本,我有点迷路。这在VS 2015 IDE Express IIS和IIS独立内部失败。 日志:大会下载成功。尝试安装文件:C:\ Users \ kieran \ Source \ Repos \ iTrace \ 2dmi \ WebAPI \ bin \ BitShuffle.dll 日志:进入下载缓存设置阶段。 ERR:从文件中提取清单导入时出错(hr = 0x80131018)。 错误:安装失败,hr = 0x80131018。 ERR:无法完成程序集的设置(hr = 0x80131018)。探测终止。 –

相关问题