web-dev-qa-db-ja.com

CMakeを使用してC#プロジェクトを生成する

Windows上の既存のC++ CMakeコードベース内でC#プロジェクトを生成しようとしています。調査の結果、CMake用に独自のCSharpコンパイラを作成したプロジェクトは2つしか見つかりませんでした。 gdcm および kde です。

両方試してみました。残念ながら、最初のものはC#プロジェクトの生成に失敗しました。代わりに、CSファイルを含むVS C++プロジェクトを作成しました。C++フラグがリンカーに設定されているため、ビルドは常にエラーで失敗しました。彼らが提供したサンプルプロジェクトを実験した後、これが「Visual Studio 8 2005」コードジェネレーターの制限が原因であるのではないかと思いますか?

2番目のプロジェクトは主にMonoを対象としていたため、私も成功しませんでした。

それらのCMakeモジュールの1つまたは他の何かを使用してC#プロジェクトを構築することで、良い経験をした人はいますか?

50
Leonid

CMake 3.8.2 以降、CSharpプロジェクトの生成はCMakeによって正式にサポートされています。

CMakeを使用してVisual Studio 2017で生成されたデフォルトのC#/ WPFプロジェクトをビルドするには、次のようにCMakeList.txtファイルを作成します。

  • プロジェクト宣言

    project(Example VERSION 0.1.0 LANGUAGES CSharp)
    
  • CMakeを含める CSharpUtilities WPFまたはその他のデザイナープロパティの使用を計画している場合。

    include(CSharpUtilities)
    
  • csxamlsettingspropertiesをすべて追加

    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 の例については、 this answer を参照してください。

34
the_storyteller

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テンプレートアプローチを使用して、正しいパスを取得することをお勧めします。

良いニュースは、次のように.csproj.templateファイルでC#ファイルをワイルドカードにできることです。

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

そして、あなたはCMakeLists.txtにこのようなものが必要で、CMakeのunixスタイルのスラッシュパス区切り文字をWindowsスタイルのバックスラッシュに変換します。そうしないと、ファイルがコンパイルされますが、Visualのプロジェクトのリンクとして表示されません。スタジオ:

FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" DOS_STYLE_SOURCE_DIR)

次に、それだけです:

CONFIGURE_FILE(MyProject.csproj.template MyProject.csproj)

CMakeLists.txtで、テンプレートファイルを正しいワイルドカードパスで実際のプロジェクトファイルに構成します。

HTH。

28
Alastair Maw

まだ誰かがこれに関する情報を探している場合に備えて、CMakeでC#プロジェクトを生成する理由は本当にありません。それらは設計上クロスプラットフォームです。 Linuxでは、C#プロジェクトは通常、Visual Studioから.csprojファイルを正常に読み取ることができるMonoDevelopで管理されます。これにより、C#プロジェクトのクロスプラットフォーム開発が可能になります。唯一の潜在的な問題は、ネイティブc ++プロジェクトがc#プロジェクトと混合されている場合(c ++でGUIを使用してc ++で記述されたバックエンドなど)、この場合は.csprojファイルをデータであるかのようにcmakeコピーするだけで、行ってよかった。 CMakeは、クロスプラットフォームになるようにビルド環境をセットアップすることを目的としています。これはc ++で非常に便利です。コードは、LinuxとWindows(または他のOSの場合)で非常に異なる方法で構築されますが、クロスプラットフォームを実行できるc#には不要であり、設計のおかげです。モノチームによる決定により、クロスプラットフォームを構築できます。 CMakeは自動化するための優れたツールをいくつか提供していますが、この機能の多くは、適切に構成された.csprojファイルで回復できます。とにかく、この質問が1年以上前のものであることは知っていますが、これを行う方法を探していたときに私が偶然見つけたトップの検索結果の1つです。それ以来、私はこのことに気づきました。

25
Max Ehrlich

2番目のc#モジュール-kdeを使用して、最終的に有効なソリューションを生成することができました。 cmakeは.csprojを取得する予定でしたが、多数の.vcprojファイルを作成しましたが、それが「Visual Studio 8 2005」ジェネレーターが提供できる唯一の形式だと思います。

それにもかかわらず、私はこのソリューションを正常に構築し、実行可能ファイルとdllライブラリを生成することができました。

2
Leonid

@the_storytellerによって提供された答えに便乗するために、 CMake v3.8 以上は、確かにファーストクラス言語としてC#をサポートしています。 WPFの例はすでに提供されているため、簡単なWindowsフォームアプリケーションの完全なCMakeの例を次に示します。ソースツリーでローカルに構築された他のライブラリをリンクしたり、サードパーティのライブラリの依存関係をリンクしたりするためのオプションのコマンドを提供しました。

Windowsフォームアプリケーションでは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
squareskittles

Visual Studioでプロジェクトを作成し、それを分解して、CMakeにconfigure_fileコマンドを使用してプロジェクトを作成させ(ソースのリストを使用してXMLのビットを生成する必要があります)、include_external_msprojectを使用してソリューションに追加できます(他のジェネレーターの場合) msbuildを手動で実行するには、カスタムターゲットを作成する必要があります。cmakeはまだそれをサポートしていないようです)。プロジェクトはかなり単純なので、それを行うことができるはずです。

1
Jan Hudec