将C++/CLI项目的.NET Framework 4.7.2更改为.NET Core 6.0

ut6juiuv  于 2023-06-07  发布在  .NET
关注(0)|答案(2)|浏览(431)

bounty将在11小时后到期。此问题的答案有资格获得+50声望奖励。advocateofnone希望引起更多关注这个问题。

我有一个Visual Studio C++/CLI项目,其中包含一些Google单元测试,该项目的配置类型为Application(可执行文件)。我试图通过以下步骤从.NET Framework 4.7.2更改为.NET Core 6.0来构建项目:https://learn.microsoft.com/en-us/dotnet/core/porting/cpp-cli
但我得到了以下错误:C++/CLI projects targeting .NET Core must be dynamic libraries.在查看相应的SDK文件时,抛出错误:
<NETSdkError Condition="('$(Language)' == 'C++' and '$(_EnablePackageReferencesInVCProjects)' != 'true') and $(OutputType) != 'library' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp'" ResourceName="NoSupportCppNonDynamicLibraryDotnetCore" />
.NET Core似乎不支持C++/CLI可执行文件:

经过搜索,我能想到两种方法

  • 更改项目以生成动态库(dll)而不是可执行文件。从dll中公开一个方法以运行所有测试。创建另一个C++本机/C#可执行项目,该项目引用此dll并运行该方法。这个方法是沿着从这里的帖子的路线:Dynamic dll load and googletest
  • 用C#重写所有测试,或者用C++/CLI重写其他单元测试框架。

有没有其他的方法,以最小的变化?有什么建议吗?

ajsxfq5m

ajsxfq5m1#

DLL是托管C++/CLI代码的最佳实践方式。
这个问题实际上是一个非常相似的问题的重复:https://stackoverflow.com/questions/75957230/is-it-possible-to-create-a-c-console-app-using-the-dotnet-cli#:~:text= C%2B%2B%2FCLI%20is%20still%20supported%20with%20VS2022%20%28both%20with.NET,wrapper%20libraries%20between%20native%20libraries%20和%20C%23%20applications.

zhte4eai

zhte4eai2#

您绝对需要更改以输出库(DLL),就像错误告诉您的那样。然后就取决于你想如何处理单元测试了。我将从创建一个 Package 器命令行项目开始,该项目只是将参数传递给DLL入口点。然后我会在空闲时重写MSTest中的测试。
According to Mike Rousos at Microsoft:

vcxproj迁移到.NET Core

现在是有趣的部分-更新示例应用程序以在.NET Core上运行。实际上,所需的更改非常少。如果您之前已经将C#项目迁移到.NET Core,则迁移C++/CLI项目甚至更简单,因为项目文件格式不会更改。对于托管项目,.NET Core和.NET Standard项目使用新的SDK样式的项目文件格式。但是,对于C++/CLI项目,使用相同的vcxproj格式来针对.NET Core作为.NET Framework。
所有需要做的就是对项目文件做一些修改。其中一些可以通过Visual Studio IDE完成,但其他(如添加WinForms引用)还不能。因此,目前更新项目文件的最简单方法是在VS中卸载项目并直接编辑vcxproj,或者使用VS Code或记事本等编辑器。
<CLRSupport>true</CLRSupport>替换为<CLRSupport>NetCore</CLRSupport>。这告诉编译器在构建时使用/clr:netcore而不是/clr。如果您愿意,可以通过Visual Studio的项目配置界面完成此更改。请注意,<CLRSupport>是在示例项目的项目文件中的每个特定于配置/平台的属性组中单独指定的,因此需要在四个不同的位置进行更新。将<TargetFrameworkVersion>4.7.2</TargetFrameworkVersion>替换为<TargetFramework>netcoreapp6.0</TargetFramework>。这些设置可以通过Visual Studio的“高级”选项卡中的项目配置界面进行修改。但是,请注意,按照上一步所述更改项目的CLR支持设置不会自动更改,因此请确保在选择.NET Core Runtime Support之前清除“.NET目标框架版本”设置。将.NET Framework引用(对System、System.Data、System.Windows.Forms和System.Xml的引用)替换为对Windows Desktop .NET Core SDK中的WinForms组件的以下引用。这一步还没有Visual Studio IDE的支持,所以必须通过直接编辑vcxproj完成。请注意,只需要对Windows Desktop SDK的引用,因为.NET Core SDK(包括System、System.Xml等库)是自动包含的。对于WinForms、WPF或两者都有不同的Framework参考(如迁移文档中所述)。

<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />

通过这些更改,C++/CLI项目将成功构建针对.NET Core的。如果您使用的是最新版本的Visual Studio 2019(16.5或16.6预览版1),则所有内容都应在运行时工作,并且迁移已完成!
在Visual Studio 2019 16.5预览版2之前,C++/CLI库没有生成C++/CLI库所需的. runtimeconfig.json文件,以指示它们使用的.NET Core版本,因此必须手动添加。因此,如果您使用的是旧版本的Visual Studio,则需要手动创建此CppCliInterop.runtimeconfig.json文件,并确保将其复制到输出目录:

{
  "runtimeOptions": {
    "tfm": "netcoreapp3.1",
    "framework": {
      "name": "Microsoft.WindowsDesktop.App",
      "version": "3.1.0"
    }
  }
}

该应用程序现在可以在.NET Core上运行!源代码的迁移版本可在示例的GitHub存储库的NetCore分支中获得。下面是在加载的模块前面运行的Windows窗体,显示已加载的coreclr.dll。

相关问题