Как создать проект Visual Studio с помощью целевой платформы .NET Standard с помощью CMake - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать проект Visual Studio C # с помощью CMake.Вот что у меня есть:

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")

Я получил имя фреймворка из файла .csproj, сгенерированного мной в Visual Studio, который выглядит следующим образом:

<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 голосов
/ 21 сентября 2018

Так мне удалось правильно сгенерировать проект.Осторожно, это безобразный хак. Проверьте, был ли обновлен 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 произошли некоторые изменения в формате csproj, которые CMake в настоящее время не может создать.Для справки эта статья охватывает их.CMake не может их сгенерировать должным образом, поэтому я сначала сообщу вам, какие изменения вам нужно внести, а затем предоставлю вам какой-нибудь хакерский скрипт PowerShell, который сделает это за вас.

Основной файл .csproj

В корне <Project> теперь есть атрибут Sdk, который нам нужно установить следующим образом:

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

Автоматически сгенерированный ZERO_CHECK проект не работает, поэтому давайте просто избавимся отэто (нам это не нужно на самом деле).Удалите его из <ProjectReference ... </ProjectReference> и, если это единственный элемент, удалите весь тег XML.

Затем, поскольку проект теперь будет автоматически ссылаться на содержимое из SDK, нам нужно избавиться от ссылок на * 1030.* и Microsoft.Common.props.В противном случае Visual Studio покажет вам предупреждение и ошибку, что материал загружается несколько раз.Просто удалите строки, содержащие эти строки.

Основной файл .sln

Стандартные проекты ALL_BUILD и ZERO_CHECK, которые всегда генерирует CMake, не работают, и я не мог быть обеспокоен должным образомисправить их, так как они не являются действительно необходимыми.Я просто удалил их из файла .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...