如何使用带有CMake的.NET Standard目标框架生成Visual Studio项目

时间:2018-09-18 19:13:40

标签: .net visual-studio cmake

我正在尝试使用CMake生成Visual Studio C#项目。这是我到目前为止的内容:

cmake_minimum_required(VERSION 3.10)

project(myProject VERSION 0.1.0 LANGUAGES CSharp)

add_library(myLib SHARED
    src/file1.cs
    src/file2.cs
    src/file3.cs)

set_property(TARGET myLib PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "netstandard1.4")

我从用Visual Studio生成的.csproj文件中获得了框架名称,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
</Project>

这是我为.NET Standard 1.4构建库所需要的。但是,CMake会生成此内容(以及其他所有内容):

<TargetFrameworkVersion>netstandard1.4</TargetFrameworkVersion>

这似乎无效,因为Visual Studio抱怨它无法打开项目。我在CMake文档中没有发现要设置<TargetFramework>而不是<TargetFrameworkVersion>的任何内容。这可能吗?

1 个答案:

答案 0 :(得分:1)

这就是我设法正确生成项目的方式。当心,这是一个丑陋的hack。 在您采用这种方式之前,请先检查CMake是否已更新为正确支持此功能

因此,第一件事:VS_DOTNET_TARGET_FRAMEWORK_VERSION是不必要的。要添加适当的<TargetFramework>,可以使用以下行:

set_property(TARGET myLib PROPERTY VS_GLOBAL_TargetFramework "netstandard1.4")

您还想添加此内容,因为出于某些原因,CMake认为默认情况下以C#3作为语言级别生成一个项目是个好主意:

set_property(TARGET myLib PROPERTY VS_GLOBAL_LangVersion "6")

生成的项目将无法在Visual Studio中正确打开。这是因为.NET Core对CMake当前无法生成的csproj格式进行了一些更改。作为参考,this article涵盖了它们。 CMake无法正确生成它们,因此,我将首先告诉您您需要进行哪些修改,然后为您提供一些可修改的PowerShell脚本。

.csproj主文件

现在在根Sdk上有一个属性<Project>,我们需要这样设置:

<Project Sdk="Microsoft.NET.Sdk" ...

自动生成的ZERO_CHECK项目无法正常工作,因此让我们摆脱它(我们并不需要它)。将其从<ProjectReference ... </ProjectReference>中删除,如果只有它,则删除整个XML标签。

然后,由于该项目现在将自动引用SDK中的内容,因此我们需要摆脱对Microsoft.CSharp.targetsMicrosoft.Common.props的引用。否则,Visual Studio将向您显示警告,并提示您多次加载了内容。只需删除包含这些字符串的行即可。

.sln主文件

CMake始终生成的标准项目ALL_BUILDZERO_CHECK无法正常工作,我也不必费心去适当地修复它们,因为它们并不是必需的。我刚刚从.sln文件中删除了它们。

完成。

就是这样!现在,您可以在Visual Studio中打开该项目,它将正常运行。

PowerShell脚本

这是我编写的脚本,用于正确生成项目和解决方案。它在文件夹cmake-vs中生成解决方案。您需要{。{1}}实用程序,它是.NET Core SDK的一部分。

请注意,路径可能无法移植。将dotnet替换为您的库名。

myLib