C++ CLI DLL 不会被 IIS7 加载,但仅当使用比 VS2008 新的版本构建时才加载

2024-04-16

对于我的开发环境,我使用 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 项目中有问题的依赖项 https://stackoverflow.com/questions/23373615/identifying-problematic-dependencies-in-c-cli-project and http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI

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

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

BadImageFormatException 完全让我失望了。我希望 Win 2K8 IIS7 服务器上显示的错误实际上更具体,但也许这只是我要求太多。

我希望这对其他人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ CLI DLL 不会被 IIS7 加载,但仅当使用比 VS2008 新的版本构建时才加载 的相关文章

随机推荐