。NET Core 3.1增加了对C++/CLI的支持(宣布了。NET Core 3.1)。官方公告列出了两个新的项目模板,CLR类库(。NET核心)和CLR空项目(。NET核心),我们确实可以找到并使用它们。
但是,没有关于支持技术(如WPF或Windows窗体)的其他信息。在九月份的一篇博文中,微软说:
我们致力于支持C++/CLI for.NET Core,以实现C++代码库与。NET技术(如WPF和Windows窗体)之间的轻松互操作。在。NET Core 3.0首次发布时,该支持不会准备就绪,但它将在Visual Studio 2019 16.4附带的。NET Core 3.1中提供
使用Visual Studio 2019 16.4.x并以。NET Core 3.1为目标,我尝试使用C++/CLI创建一个演示WinForms应用程序。然而,它并不起作用。
首先,面向。NET核心的C++/CLI项目必须是DLL:
错误NETSDK1116:面向。NET核心得C++/CLI项目必须是动态库。
因此,我尝试将Win表单代码保存在用/clr:netcore
编译的C++/CLI DLL中,并从本机应用程序运行它。但是,我得到了一个运行时异常:
未处理的异常。System.BadImageFormatException:无法加载文件或程序集“System.Windows.Forms,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=B77A5C561934E089"。试图加载格式不正确的程序。文件名:'System.Windows.Forms,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=B77A5C561934E089'--->;System.BadImageFormatException:试图加载格式不正确的程序。(0x8007000B)
我在C++/CLI项目中引用了来自C:\Program Files\DotNet\Shared\Microsoft.WindowsDesktop.App\3.1.0\的System.Windows.Forms.DLL,后者是Microsoft.WindowsDesktop.App 3.1.0运行时的位置。
这是不是真的管用而我却做错了什么?
我在使用C++/CLI(托管C++).NET Core DLL的。NET Core C#可执行文件的简单示例中也遇到了类似的问题。最终发现我需要显式地将C#可执行目标从任何CPU设置为x64。大多数情况下可归结为32位/64位不匹配。
我在微软的网站上找到了这份文件。它解释了如何实现该操作,并附带了一个github repo,您可以轻松地自己克隆和试用:https://devblogs.microsoft.com/cppblog/porting-a-c-cli-project-to-net-core/