簡體   English   中英

如何使用 CMake 生成帶有 .NET Standard 目標框架的 Visual Studio 項目

[英]How to generate Visual Studio project with .NET Standard target framework with 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> 這可能嗎?

這就是我設法正確生成項目的方式。 當心,這是一個丑陋的黑客。 您這樣做之前,請檢查 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 格式發生了一些變化。 作為參考,本文涵蓋了它們。 CMake 無法正確生成它們,因此我將首先告訴您需要進行哪些修改,然后為您提供一些 hacky PowerShell 腳本來為您執行此操作。

主 .csproj 文件

現在根<Project>上有一個屬性Sdk ,我們需要這樣設置:

<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生成解決方案。 您需要dotnet實用程序,它是 .NET Core SDK 的一部分。

請注意,路徑可能不可移植。 myLib替換為您的庫名稱。

mkdir -Force cmake-vs | Out-Null
Set-Location cmake-vs
& "$Env:Programfiles\CMake\bin\cmake.exe" -G "Visual Studio 15 2017 Win64" ".."
& "$Env:Programfiles\CMake\bin\cmake.exe" --build .
((Get-Content "myLib.csproj") `
  <# add Sdk attribute to project which is needed by netstandard1.4 #> `
  -replace ('<Project ','<Project Sdk="Microsoft.NET.Sdk" ') `
  <# remove reference to ZERO_CHECK project which causes problems #> `
  -replace ('(?ms)<ProjectReference.*</ProjectReference>','') |
  <# remove imports that are unneccessary for netstandard1.4 and cause
     problems #> `
  Select-String -Pattern "Microsoft.CSharp.targets" -NotMatch |
  Select-String -Pattern "Microsoft.Common.props" -NotMatch |
  <# for some reason, Select-String prepends an empty line which is not
     allowed before <?xml ..., so we trim it away. #>
  Out-String).Trim() | Out-File "myLib.csproj"
<# use dotnet util (part of the .NET Core SDK) to remove projects with problems
   from the solution because I am really tired of regexes #>
& "$Env:Programfiles\dotnet\dotnet.exe" sln myLib.sln remove ALL_BUILD.vcxproj
& "$Env:Programfiles\dotnet\dotnet.exe" sln myLib.sln remove ZERO_CHECK.vcxproj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM