对于我的开发环境,我使用 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 需要为特定平台构建。
我还尝试了.NET4.5.1 x86版本的CLI DLL(使用VS2013),它也可以与所有Winforms应用程序一起正常工作,并且可以在我的开发计算机上与ASP.NET一起使用(使用x86 IIS Express),但是它不适用于 Win2K8 IIS7 服务器(x86 版本)。尝试加载此 DLL 时出现相同的 BadImageFormatException 错误。
在服务器上,由于 ASP.NET Identity 代码,它使用集成应用程序池(不允许我使用经典模式)。此外,“32 位应用程序”设置已切换为 True/False,但都没有帮助解决此问题。
如果我使用 VS2008 甚至 VS2013 为 .NET 2 或 .NET 3.5 和 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 中嵌入某些内容(或从其中保留某些内容),从而导致 DLL 无法加载到 IIS7 上?
如有任何帮助或建议,我们将不胜感激。
好吧,在解决这个问题近一个月后,昨晚在这里询问,我发现了这些链接:
识别 C++/CLI 项目中有问题的依赖项 和 http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI
虽然他们实际上没有指定解决方案,但其中有一些我还没有尝试过的东西,那就是检查 Windows 2008 R2 服务器是否需要 VS2013 C++ 可再发行组件包。
安装 x86 和 x64 可再发行软件包后,使用本机 C++ 库的托管 C++ 包装器的 x64 ASP.NET 应用程序就诞生了。现在一切都按预期进行。我可以使用 VS2013 工具集、x64 平台、使用 .NET v4.5.1 来编译包装器 DLL,并且它工作得很好。我不再需要 VS2008 工具集。
BadImageFormatException 完全让我失望了。如果Win 2K8 IIS7服务器上显示的错误更具体,那就太好了,但也许这只是我要求太多了。
我希望这对其他人有帮助。