IIS7未加载C++CLI DLL,但仅当使用比VS2008更新的内容构建时才加载

本文关键字:加载 更新 VS2008 构建 DLL C++CLI IIS7 | 更新日期: 2023-09-27 18:27:19

对于我的开发环境,我使用的是带有VS2008、V2010和VS2013的Windows 7 Ultimate x64,我的应用程序是用C#编写的。

远程测试服务器具有Windows Web server 2008 R2 x64和IIS 7。

这是我的具体问题:

我有一个本机C++库,我想在我的C#应用程序中使用它,所以我围绕它编写了一个C++CLI/CLR包装器,并将其全部编译到同一个DLL中。我尝试过将C++源代码编译到DLL中,也尝试过将本机库静态链接到DLL中。两者都给出了如下所述的相同结果。

如果我使用x64和.NET 4.5.1与VS2013构建此DLL,那么此DLL可以与开发环境内外的任何C#Winforms应用程序配合使用。当在我的开发环境中的ASP.NET应用程序中引用时(使用x64 IIS Express进行测试),它也可以工作。当web应用程序部署(作为x64版本)到Win2K8 IIS7服务器时,它不起作用,显示BadImageFormatException。我不为"AnyCPU"构建,因为CLI包装器DLL需要为特定平台构建。

我还尝试过.NET4.5.1 x86版本的CLI DLL(使用VS2013),它也能很好地与所有Winforms应用程序配合使用,并能在我的开发机器上与ASP.NET配合使用(使用x86 IIS Express),但它不能在Win2K8 IIS7服务器上工作(x86版本)。尝试加载此DLL时出现相同的BadImageFormatException错误。

在服务器上,由于ASP.NET标识代码,它使用集成的应用程序池(不允许我使用经典模式)。此外,"32位应用程序"设置已切换为True/False,两者都无助于解决此问题。

如果我为.NET 2或.NET 3.5以及带有VS2008甚至VS2013的x86平台构建C++CLI DLL,但选择VS2008(V90)作为平台工具集,那么它在Win2K8 IIS7服务器上运行良好,没有BadImageFormatException错误。ASP.NET集成应用程序池"32位应用程序"的设置为"True"才能正常工作。

如果我将C++CLI DLL构建为.NET 2或3.5、x86平台,但使用比VS2008工具集更新的工具集,则它无法在IIS服务器上加载,出现BadImageFormatException,即使它在开发机器ASP.NET和任何Winforms应用程序中都能正常工作。

使用VS2008、.NET 2或3.5以及x64平台,DLL可在任何Winforms应用程序中使用,可在开发计算机上与ASP.NET/IIS Express x64一起使用,但不可在Win2K8 IIS7服务器上使用,显示BadImageFormatException。应用程序池"32位应用程序"设置为True和False进行测试。

因此,总之,在IIS7上工作的唯一选项是使用VS2008(V90)工具集选择x86平台进行构建。

有没有人经历过这样的事情,或者知道是什么导致了这个问题。我看不出工作DLL和其他使用JetBrains dotNetPeek 1.1的DLL之间有什么明显的不同,但这只是表面上的。。。所有的代码都存在于其中。在V100或更高版本的工具集中,是否有一个选项在DLL中嵌入了一些东西(或从中删除了一些东西),导致它无法加载到IIS7上?

如有任何帮助或建议,我们将不胜感激。

IIS7未加载C++CLI DLL,但仅当使用比VS2008更新的内容构建时才加载

好吧,在解决这个问题近一个月后,我昨晚在这里询问了一下,我发现了以下链接:

识别C++/CLI项目中存在问题的依赖关系和http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI

虽然他们实际上没有指定解决方案,但其中有一些内容我还没有尝试过,那就是检查Windows 2008 R2服务器是否需要VS2013 C++可再分发包。

我安装了x86和x64可再发行软件包,突然间,我的x64 ASP.NET应用程序开始运行,该应用程序为本机C++库使用托管C++包装器。现在一切都按计划进行。我可以使用.NET的v4.5.1,使用VS2013工具集x64平台编译包装器DLL,它运行得非常好。我不再需要VS2008工具集。

BadImageFormatException就这么多了,让我彻底失望。我希望Win 2K8 IIS7服务器上显示的错误实际上更具体,但话说回来,也许这只是我要求太多了。

我希望这能帮助其他人。