Генерация C # проекта с использованием CMake - PullRequest
43 голосов
/ 15 января 2010

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

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

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

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

Ответы [ 6 ]

32 голосов
/ 16 сентября 2017

Начиная с CMake 3.8.2 , генерация проекта CSharp официально поддерживается CMake.

Чтобы создать проект C # / 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 файл свойств в качестве точки входа в программу (если проект является проектом 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 см. в этом ответе .

27 голосов
/ 14 марта 2013

CMake 2.8.9 и выше добавьте параметр TYPE к include_external_msproject примерно так:

include_external_msproject(
    MyProject MyProject.csproj
    TYPE FAE04EC0-301F-11D3-BF4B-00C04F79EFBC)

Это позволяет вам указать, что проект является C # (магический GUID выше), в противном случае все будет сложно ( см. Документы ).

Возможно, вы все еще захотите использовать шаблонный подход configure_file, упомянутый в другом месте с вашим файлом .csproj, чтобы получить правильные пути к нему, если только вы не встраиваетесь прямо в дерево исходных текстов.

Хорошей новостью является то, что вы можете подстановочные знаки для ваших файлов C # в файле .csproj.template, например, так:

<ItemGroup>
  <Compile Include="${DOS_STYLE_SOURCE_DIR}\**\*.cs" />
</ItemGroup>

И вам понадобится что-то подобное в вашем CMakeLists.txt, чтобы преобразовать разделители путей прямой обратной косой черты 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, чтобы сконфигурировать файл шаблона в реальный файл проекта с правильным подстановочным путем.

НТН.

24 голосов
/ 07 июля 2011

На тот случай, если кто-то все еще ищет информацию об этом, на самом деле нет причин создавать проекты на C # с помощью CMake, они кроссплатформенные.В Linux проекты C # обычно управляются с помощью MonoDevelop, который может отлично читать файлы .csproj из Visual Studio.Это должно позволить кросс-платформенную разработку проектов C #.Единственная потенциальная проблема - если у вас есть нативные проекты на c ++, смешанные с проектами на c # (например, бэкэнд, написанный на c ++ с графическим интерфейсом на c #), в этом случае просто сделайте cmake-копию ваших файлов .csproj, как если бы они были данными, и вам следуетхорошо идтиCMake предназначен для настройки вашей среды сборки на кроссплатформенность.Это очень удобно с C ++, где код построен в Linux совсем по-другому, нежели в Windows (или других ОС, если вы в этом заинтересованы), но он не нужен для C #, который может выполнять кроссплатформенность, и, благодаря дизайнуРешения моно команды, можно построить кроссплатформенный.CMake предоставляет некоторые отличные инструменты для автоматизации вещей, но большая часть этой функциональности может быть восстановлена ​​с помощью правильно настроенного файла .csproj.В любом случае, я знаю, что этому вопросу больше года, но это один из лучших результатов поиска, на который я наткнулся, когда искал, как это сделать.С тех пор я понял это.

2 голосов
/ 10 апреля 2019

В ответ на ответ, предоставленный @the_storyteller, CMake v3.8 и выше действительно поддерживает C # как первоклассный язык.Поскольку пример WPF уже был предоставлен, вот полный пример CMake для простого приложения Windows Forms.Я предоставил дополнительные команды для связывания в других библиотеках, созданных локально в дереве исходных текстов, и связывания зависимостей сторонних библиотек.

Обратите внимание, что приложения Windows Forms требуют использования команды csharp_set_windows_forms_properties CMake, тогда как 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"
)
2 голосов
/ 16 января 2010

Мне наконец удалось сгенерировать правильное решение, используя второй модуль c # - kde. Хотя cmake создал несколько файлов .vcproj, в то время как я ожидал получить .csproj, но я думаю, что это единственная форма, которую может предложить генератор «Visual Studio 8 2005».

Тем не менее мне удалось успешно построить это решение и создать исполняемые файлы и библиотеки DLL.

1 голос
/ 25 июня 2012

Вы можете создать проект с помощью Visual Studio, затем разобрать его и заставить CMake написать его с помощью команды configure_file (вам нужно будет сгенерировать немного XML со списком источников) и добавить его в решение с помощью include_external_msproject (для других генераторов вам нужно создать пользовательскую цель для запуска msbuild на ней вручную; cmake, похоже, пока не поддерживает этого). Проект довольно прост, поэтому это должно быть возможно.

...