运行 在 .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 项目文件列表。
我刚刚发现了一些意外的依赖关系。
我非常兴奋地看到 .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 项目文件列表。
我刚刚发现了一些意外的依赖关系。