对于我的开发环境,我使用的是Windows 7 Ultimate x64,VS2008,V2010和VS2013,我的应用程序是用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需要为特定平台构建.
我也尝试过.NET DLL的.NET4.5.1 x86版本(使用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平台.
有没有人经历过这样的事情,或者知道可能导致这个问题的原因.使用JetBrains dotNetPeek 1.1,我看不到工作DLL和其他工作DLL之间有什么大不相同,但这只是表面上看......所有代码都存在于那里.在V100或更高版本的工具集中是否有一个选项可以在DLL中嵌入一些东西(或者留下一些东西),导致它无法加载到IIS7上?
任何帮助或建议将不胜感激.