![](/img/trans.png)
[英]How do I target .NET Standard 2.0 from my .NET Framework project in 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 腳本來為您執行此操作。
現在根<Project>
上有一個屬性Sdk
,我們需要這樣設置:
<Project Sdk="Microsoft.NET.Sdk" ...
自動生成的ZERO_CHECK
項目不起作用,所以讓我們擺脫它(我們真的不需要它)。 從<ProjectReference ... </ProjectReference>
刪除它,如果它是唯一的項目,則刪除整個 XML 標記。
然后,由於項目現在將自動引用 SDK 中的內容,我們需要擺脫對Microsoft.CSharp.targets
和Microsoft.Common.props
的引用。 否則,Visual Studio 將向您顯示警告和錯誤,說明內容已加載多次。 只需刪除包含這些字符串的行。
CMake 總是生成的標准項目ALL_BUILD
和ZERO_CHECK
不起作用,我無法正確修復它們,因為它們並不是真正必要的。 我剛剛從.sln
文件中刪除了它們。
就是這樣! 現在您可以在 Visual Studio 中打開該項目,它會正常工作。
這是我編寫的腳本,作為正確生成項目和解決方案的解決方法。 它在文件夾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.