Создайте проект С#, используя CMake
Я пытаюсь сгенерировать проект С# в существующей базе кода C++ CMake в Windows. После некоторых исследований я смог найти только два проекта, которые создавали свои собственные компиляторы CSharp для CMake: gdcm и kde.
Я попробовал их обоих. К сожалению, первый не смог создать проект С#. Вместо этого он создал проект VS C++ с файлами CS в нем, и из-за флагов C++, установленных для компоновщика, сборка всегда завершалась ошибкой. Поэкспериментировав с примером проекта, который они предоставили, мне интересно, может ли это быть связано с ограничением генератора кода "Visual Studio 8 2005"?
Второй проект был в первую очередь нацелен на Mono, поэтому я тоже не добился успеха.
У кого-нибудь был положительный опыт создания проектов на С# с использованием одного из этих модулей CMake или чего-то еще?
Ответы
Ответ 1
Начиная с CMake 3.8.2, генерация проекта CSharp официально поддерживается CMake.
Чтобы создать проект С#/WPF, созданный по умолчанию в Visual Studio 2017, с использованием CMake, создайте файл CMakeList.txt следующим образом.
-
Декларация проекта
project(Example VERSION 0.1.0 LANGUAGES CSharp)
-
Включите CMake CSharpUtilities
если вы планируете использовать WPF или другие свойства дизайнера.
include(CSharpUtilities)
-
Добавить все cs
, xaml
, settings
, properties
add_executable(Example
App.config
App.xaml
App.xaml.cs
MainWindow.xaml
MainWindow.xaml.cs
Properties/AssemblyInfo.cs
Properties/Resources.Designer.cs
Properties/Resources.resx
Properties/Settings.Designer.cs
Properties/Settings.settings)
-
Свяжите файлы конструктора, файлы xaml
и другие файлы свойств с соответствующими файлами cs
csharp_set_designer_cs_properties(
Properties/AssemblyInfo.cs
Properties/Resources.Designer.cs
Properties/Resources.resx
Properties/Settings.Designer.cs
Properties/Settings.settings)
csharp_set_xaml_cs_properties(
App.xaml
App.xaml.cs
MainWindow.xaml
MainWindow.xaml.cs)
-
Установить App.xaml
свойств App.xaml
качестве точки входа в программу (если проект является проектом WPF)
set_property(SOURCE App.xaml PROPERTY VS_XAML_TYPE "ApplicationDefinition")
-
Установить другие флаги csproj
файла
set_property(TARGET Example PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1")
set_property(TARGET Example PROPERTY WIN32_EXECUTABLE TRUE)
...
-
Добавить библиотеки
set_property(TARGET Example PROPERTY VS_DOTNET_REFERENCES
"Microsoft.CSharp"
"PresentationCore"
"PresentationFramework"
"System"
"System.Core"
"System.Data"
"System.Data.DataSetExtensions"
"System.Net.Http"
"System.Xaml"
"System.Xml"
"System.Xml.Linq"
"WindowsBase")
Рабочий пример WPF см. По адресу https://github.com/bemehiser/cmake_csharp_example.
Для примера WinForms см. Этот ответ.
Ответ 2
CMake 2.8.9 и выше добавьте параметр TYPE
к include_external_msproject
так:
include_external_msproject(
MyProject MyProject.csproj
TYPE FAE04EC0-301F-11D3-BF4B-00C04F79EFBC)
Это позволяет указать, что проект - это С# (магический GUID выше), в противном случае все проблемы (см. в документах).
Возможно, вы все равно захотите использовать подход шаблона configure_file
, упомянутый в другом месте, с вашим файлом .csproj
, чтобы получить в нем правильные пути, если только вы не строите прямо в исходное дерево.
Хорошей новостью является то, что вы можете подстановочить свои файлы С# в файле .csproj.template
следующим образом:
<ItemGroup>
<Compile Include="${DOS_STYLE_SOURCE_DIR}\**\*.cs" />
</ItemGroup>
И вам понадобится что-то вроде этого в вашем CMakeLists.txt
, чтобы преобразовать разделители путей в стиле Unix-стиля CMake в обратные косые черты в стиле Windows, иначе он будет компилировать файлы, но они не будут отображаться как ссылки в проекте в Visual Studio:
FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" DOS_STYLE_SOURCE_DIR)
Тогда это просто:
CONFIGURE_FILE(MyProject.csproj.template MyProject.csproj)
В CMakeLists.txt
для настройки файла шаблона в файл реального проекта с правильным шаблоном подстановки.
НТН.
Ответ 3
На всякий случай кто-то все еще ищет информацию об этом, на самом деле нет причин генерировать проекты С# с CMake, они являются кросс-платформенными по дизайну. В Linux проекты С# обычно управляются с помощью MonoDevelop, которые отлично читают файлы .csproj из visual studio. Это должно позволить кросс-платформенную разработку проектов С#.
Единственная потенциальная проблема заключалась бы в том, что если бы у вас были родные проекты на С++, смешанные с проектами С# (например, бэкэнд, написанный на С++ с графическим интерфейсом в С#), в этом случае просто cmake копирует файлы .csproj, как если бы они были данными, и вы должны хорошо идти.
CMake предназначен для настройки среды сборки на кросс-платформу. Это очень удобно при использовании С++, где код построен по-разному в Linux, чем на окнах (или других ОС, если вы в них), но для некоторых С#, которые могут выполнять кросс-платформу, и благодаря дизайну решения моно-команды, могут строить кросс-платформу. CMake предоставляет отличные инструменты для автоматизации, но большая часть этой функции может быть восстановлена с помощью правильно сконфигурированного файла .csproj.
В любом случае, я знаю, что этот вопрос старше года, но это один из лучших результатов поиска, на который я наткнулся, когда искал, как это сделать. С тех пор я сделал это.
Ответ 4
Наконец, я смог создать корректное решение, используя второй модуль С# - kde.
Хотя cmake создал несколько файлов .vcproj, пока я ожидал получить .csproj, но я думаю, что это единственная форма, которую может предложить генератор Visual Studio 8 2005.
Тем не менее я смог успешно построить это решение и создать библиотеки исполняемых файлов и библиотек dll.
Ответ 5
Вы можете создать проект с помощью Visual Studio, чем разобрать его и заставить CMake записать его с помощью команды configure_file
(вам нужно будет сгенерировать бит XML со списком источников) и добавить его в решение с помощью include_external_msproject
(для других генераторов вам нужно создать пользовательскую цель для запуска msbuild на нем вручную; cmake, похоже, пока не поддерживает это). Проект довольно прост, так что это должно быть возможно.
Ответ 6
В дополнение к ответу, предоставленному @the_storyteller, CMake v3.8 и выше действительно поддерживает С# как первоклассный язык. Поскольку пример WPF уже был предоставлен, вот полный пример CMake для простого приложения Windows Forms. Я предоставил дополнительные команды для связи в других библиотеках, созданных локально в дереве исходных текстов, и связывания зависимостей сторонних библиотек.
Обратите внимание, что приложения Windows Forms требуют использования команды CMake csharp_set_windows_forms_properties
, тогда как проекты WPF используют csharp_set_designer_cs_properties
и csharp_set_xaml_cs_properties
.
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(MyWinFormApp LANGUAGES CSharp)
# Include CMake utilities for CSharp, for WinForm and WPF application support.
include(CSharpUtilities)
# Define the executable, including any .cs files.
# The .resx and other Properties files are optional here, but including them makes them visible in the VS solution for easy editing.
add_executable(MyWinFormApp
App.config
Form1.cs
Form1.Designer.cs
Form1.resx
Program.cs
Properties/AssemblyInfo.cs
Properties/Resources.Designer.cs
Properties/Resources.resx
Properties/Settings.Designer.cs
Properties/Settings.settings
)
# Set the .NET Framework version for the executable.
set_property(TARGET MyWinFormApp PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1")
# Set the executable to be 32-bit.
set_property(TARGET MyWinFormApp PROPERTY WIN32_EXECUTABLE TRUE)
# Set the C# language version (defaults to 3.0).
set(CMAKE_CSharp_FLAGS "/langversion:latest")
# Set the source file properties for Windows Forms use.
csharp_set_windows_forms_properties(
Form1.cs
Form1.Designer.cs
Form1.resx
Program.cs
Properties/AssemblyInfo.cs
Properties/Resources.Designer.cs
Properties/Resources.resx
Properties/Settings.Designer.cs
Properties/Settings.settings
)
# If necessary, link in other library dependencies that were built locally in this source tree.
target_link_libraries(MyWinFormApp MyLocalLib)
# If necessary, link in other library/DLL references, such as 3rd party libraries.
set_property(TARGET MyWinFormApp PROPERTY
VS_DOTNET_REFERENCE_MyThirdPartyLib /path/to/libs/MyThirdPartyLib.dll)
# Add in the .NET reference libraries.
set_property(TARGET MyWinFormApp PROPERTY VS_DOTNET_REFERENCES
"Microsoft.CSharp"
"System"
"System.Core"
"System.Data"
"System.Drawing"
"System.Windows.Forms"
)