Так мне удалось правильно сгенерировать проект.Осторожно, это безобразный хак. Проверьте, был ли обновлен 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