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上?
如有任何帮助或建议,我们将不胜感激。
好吧,在解决这个问题近一个月后,我昨晚在这里询问了一下,我发现了以下链接:
识别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服务器上显示的错误实际上更具体,但话说回来,也许这只是我要求太多了。
我希望这能帮助其他人。