我正在尝试在Windows上的现有C ++ CMake代码库中生成C#项目。经过一些研究,我发现只有两个项目为CMake构建了自己的CSharp编译器: gdcm和kde。
我试过了他们两个。不幸的是,第一个未能生成C#项目。相反,它创建了一个带有cs文件的VS C ++项目,并且由于为链接器设置了C ++标志,因此构建总是失败并出现错误。在尝试了他们提供的示例项目之后,我想知道这是否可能是由于“Visual Studio 8 2005”代码生成器的限制?
第二个项目主要针对Mono,所以我也没有成功。
有没有人在使用其中一个CMake模块或其他东西构建C#项目方面有积极的经验?
答案 0 :(得分:32)
自CMake 3.8.2起,CMharp正式支持CSharp项目生成。
要使用CMake构建默认的Visual Studio 2017生成的C#/ WPF项目,请按如下方式创建CMakeList.txt文件。
项目声明
project(Example VERSION 0.1.0 LANGUAGES CSharp)
如果您打算使用WPF或其他设计师属性,请包含CMake CSharpUtilities
。
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 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。
答案 1 :(得分:27)
CMake 2.8.9及以上向TYPE
添加include_external_msproject
参数,如下所示:
include_external_msproject(
MyProject MyProject.csproj
TYPE FAE04EC0-301F-11D3-BF4B-00C04F79EFBC)
这允许您指定项目是C#(上面的魔术GUID),否则事情会很困难(see docs)。
您可能仍然希望使用configure_file
文件中提到的.csproj
模板方法来获取正确的路径,除非您直接构建到源树中。
好消息是你可以在.csproj.template
文件中通配你的C#文件,如下所示:
<ItemGroup>
<Compile Include="${DOS_STYLE_SOURCE_DIR}\**\*.cs" />
</ItemGroup>
你需要在CMakeLists.txt
中使用类似的东西将CMake的unix风格的转发路径分隔符转换成Windows风格的反斜杠,否则它会编译文件,但它们不会显示为链接Visual Studio中的项目:
FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" DOS_STYLE_SOURCE_DIR)
然后就是:
CONFIGURE_FILE(MyProject.csproj.template MyProject.csproj)
在CMakeLists.txt
中将模板文件配置为具有正确通配符路径的实际项目文件。
HTH。
答案 2 :(得分:24)
万一有人仍然在寻找有关这方面的信息,实际上没有理由用CMake生成C#项目,它们是跨设计的跨平台。在Linux上,C#项目通常使用MonoDevelop进行管理,可以从visual studio中读取.csproj文件。这应该可以实现C#项目的跨平台开发。 唯一可能的问题是,如果你将原生c ++项目与c#项目混合在一起(比如用c#中用c ++编写的后端),在这种情况下只需要对你的.csproj文件进行cmake复制,就像它们是数据一样,你应该很高兴去。 CMake旨在将您的构建环境设置为跨平台。这对于c ++非常方便,其中代码在linux上以非常不同的方式构建,而不是在windows(或其他操作系统,如果你进入),但对于可以执行跨平台的c#来说是不必要的,并且,由于设计单声道团队的决策,可以构建跨平台。 CMake确实提供了一些很好的自动化工具,但是大部分功能都可以通过正确配置的.csproj文件来恢复。 无论如何,我知道这个问题已经超过一年了,但它是我在查找如何做到这一点时偶然发现的顶级搜索结果之一。我已经实现了这一点。
答案 3 :(得分:2)
我终于能够使用第二个c#模块生成有效的解决方案 - kde。 虽然,cmake创建了一些.vcproj文件,而我希望得到.csproj,但我想这是“Visual Studio 8 2005”生成器可以提供的唯一形式。
然而,我能够成功构建此解决方案并生成可执行文件和DLL库。
答案 4 :(得分:2)
要piggy带@the_storyteller提供的答案,CMake v3.8及更高版本的确支持C#作为一流语言。因为已经提供了WPF示例,所以这里是用于简单Windows Forms应用程序的完整CMake示例。我提供了可选命令,用于链接在源树中本地构建的其他库中以及链接第三方库依赖项。
请注意,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"
)
答案 5 :(得分:1)
您可以使用Visual Studio创建项目,而不是将其拆开并使CMake使用configure_file
命令编写它(您必须使用源列表生成一些XML)并将其添加到使用include_external_msproject
的解决方案(对于其他生成器,您需要创建自定义目标以手动运行msbuild; cmake似乎不支持这样做)。该项目相当简单,因此应该可以这样做。