Windows上の既存のC++ CMakeコードベース内でC#プロジェクトを生成しようとしています。調査の結果、CMake用に独自のCSharpコンパイラを作成したプロジェクトは2つしか見つかりませんでした。 gdcm および kde です。
両方試してみました。残念ながら、最初のものはC#プロジェクトの生成に失敗しました。代わりに、CSファイルを含むVS C++プロジェクトを作成しました。C++フラグがリンカーに設定されているため、ビルドは常にエラーで失敗しました。彼らが提供したサンプルプロジェクトを実験した後、これが「Visual Studio 8 2005」コードジェネレーターの制限が原因であるのではないかと思いますか?
2番目のプロジェクトは主にMonoを対象としていたため、私も成功しませんでした。
それらのCMakeモジュールの1つまたは他の何かを使用してC#プロジェクトを構築することで、良い経験をした人はいますか?
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)
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 の例については、 this answer を参照してください。
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。
まだ誰かがこれに関する情報を探している場合に備えて、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つです。それ以来、私はこのことに気づきました。
2番目のc#モジュール-kdeを使用して、最終的に有効なソリューションを生成することができました。 cmakeは.csprojを取得する予定でしたが、多数の.vcprojファイルを作成しましたが、それが「Visual Studio 8 2005」ジェネレーターが提供できる唯一の形式だと思います。
それにもかかわらず、私はこのソリューションを正常に構築し、実行可能ファイルとdllライブラリを生成することができました。
@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"
)
Visual Studioでプロジェクトを作成し、それを分解して、CMakeにconfigure_file
コマンドを使用してプロジェクトを作成させ(ソースのリストを使用してXMLのビットを生成する必要があります)、include_external_msproject
を使用してソリューションに追加できます(他のジェネレーターの場合) msbuildを手動で実行するには、カスタムターゲットを作成する必要があります。cmakeはまだそれをサポートしていないようです)。プロジェクトはかなり単純なので、それを行うことができるはずです。