运行 在 .NET Core 3.1 中管理 C++/CLI 程序集时图像格式错误

Bad image format when running managed C++/CLI assembly in .NET Core 3.1

我非常兴奋地看到 .NET Core 3.1 和 Visual Studio 2019 add support for managed C++/CLI projects 的最新预览,因为这样的项目是将特定项目保留在 .NET Framework 上的唯一想法。

因此,我安装了 Visual Studio Preview 16.4.0 Preview 4 以及 "C++/CLI support for v142..." 选项,正如预期的那样,我看到了新的 C++ CLR 模板并安装了 .NET Core 3.1 preview 2

我使用 "CLR Class Library (.NET Core)" 模板创建了一个新项目,将文件复制到一个旧的托管 C++/CLI 项目,稍加调整,然后构建了程序集 - 太棒了!

但是,当我尝试在 .NET Core 3.1 中使用程序集时,出现了这个致命异常:

Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'MyAssembly, Version=2019.0.1.0, Culture=neutral, PublicKeyToken=null'. An attempt was made to load a program with an incorrect format.
File name: 'MyAssembly, Version=2019.0.1.0, Culture=neutral, PublicKeyToken=null'
   at TestApp.Program.Main(String[] args)

托管程序集和测试应用程序都以 X64 为目标。任何想法可能是什么问题?

Microsoft 的某人在 Github repo 上提供了解决方案。

构建托管 C++/CLI 项目时,文件 ijwhost.dll 会放置在程序集旁边的输出文件夹中 - 此文件需要与使用该程序集的应用一起部署。

ijwhost.dll 放入与应用程序相同的文件夹后,它按预期运行。

顺便说一句,我针对 .NET Core 3.1 预览构建的旧 C++/CLI 项目实际上非常复杂 - 我 非常 惊喜地发现它基本上 "just worked"!

希望以后能使用更好的错误信息!

在我的例子中,c# Net 5.0 应用程序加载托管 C++ dll,它环绕着非托管 C++ dll.I 每次我尝试 运行 在没有 [=14= 的机器上时都会出现此错误] 安装。我用 ProcessMonitor 调试它并发现它找不到 VCRUNTIME140D.dll。在我的开发 PC 中找到这些 dll,将它们(32 位和 64 位版本)从我的开发机器复制到客户的机器到相应的文件夹,这就成功了。希望能帮助别人。干杯。

我使用 .net 5.0 作为 CLI 运行时间。我终于发现我遇到的问题是缺少本机依赖 DLL。

对于原生应用程序,会有错误提示告诉您缺少哪个DLL。在 .net 核心 C++/CLI 中,它们只会给你一个 BadImageFormatException。

我的解决方案是,创建一个纯本机控制台项目,粘贴将导致 BadImageFormatException 的代码,运行 它并查看缺少哪个 DLL,然后将其添加回 C++/CLI 项目文件列表。

我刚刚发现了一些意外的依赖关系。