Подтвердить что ты не робот

Создайте проект С#, используя CMake

Я пытаюсь сгенерировать проект С# в существующей базе кода C++ CMake в Windows. После некоторых исследований я смог найти только два проекта, которые создавали свои собственные компиляторы CSharp для CMake: gdcm и kde.

Я попробовал их обоих. К сожалению, первый не смог создать проект С#. Вместо этого он создал проект VS C++ с файлами CS в нем, и из-за флагов C++, установленных для компоновщика, сборка всегда завершалась ошибкой. Поэкспериментировав с примером проекта, который они предоставили, мне интересно, может ли это быть связано с ограничением генератора кода "Visual Studio 8 2005"?

Второй проект был в первую очередь нацелен на Mono, поэтому я тоже не добился успеха.

У кого-нибудь был положительный опыт создания проектов на С# с использованием одного из этих модулей CMake или чего-то еще?

4b9b3361

Ответ 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"
)