对于我的开发环境,我使用 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 上?
任何帮助或建议将不胜感激。