2010-01-15 254 views
35

我试图在Windows上的现有C++ CMake代码库中生成C#项目。经过一番研究,我只能找到两个为CMake构建自己的CSharp编译器的项目: gdcmkde使用CMake生成C#项目

我试了两种。不幸的是,第一个未能生成C#项目。相反,它创建了一个包含cs文件的VS C++项目,并且因为为链接器设置了C++标记,所以构建总是失败并出现错误。在对他们提供的示例项目进行实验之后,我想知道这是否可能是由于“Visual Studio 8 2005”代码生成器的限制造成的?

第二个项目主要针对Mono,所以我也没有成功。

有没有人有过使用其中一个CMake模块构建C#项目的积极体验?

回答

1

我终于能够使用第二个c#模块-kde生成一个有效的解决方案。 尽管cmake创建了一些.vcproj文件,但我期望获得.csproj,但我想这是唯一的“Visual Studio 8 2005”生成器可以提供的形式。

不过,我能够成功地构建这个解决方案并生成可执行文件和dll库。

+0

更新:是CMake的创建C++与C#源文件的项目,他们的事实使得项目几乎无法使用 - 智能感知不工作,app.config中无法通过常规手段来访问等 我停止进一步调查在这个方向上并切换到基于MsBuild的项目配置。 – Leonid 2010-01-20 01:45:28

21

为防万一还在寻找关于这方面的信息,真的没有理由用CMake生成C#项目,它们是跨平台设计的。在Linux上,C#项目通常使用MonoDevelop进行管理,MonoDevelop可以很好地从Visual Studio读取.csproj文件。这应该能够跨平台开发C#项目。 唯一的潜在问题是如果你有与c#项目混合的本地C++项目(比如在c#中用C++编写的后端),在这种情况下只需将cmake复制到你的.csproj文件中,就好像它们是数据一样应该很好走。 CMake旨在将您的构建环境设置为跨平台。这对C++来说非常方便,其中代码在linux上的构建方式与在windows上的构建方式完全不同,但对于可以执行跨平台的c#来说是不必要的,并且由于设计mono团队的决策可以构建跨平台。 CMake确实提供了一些很棒的工具来自动化事物,但其中的大部分功能都可以通过正确配置的.csproj文件来恢复。 无论如何,我知道这个问题已经过去了一年多了,但它是我在寻找如何做到这一点时偶然发现的顶级搜索结果之一。我已经做到了这一点。

+3

是的,但虽然cmake也提供了安装功能,但纯C#项目(csproj)却没有。如果cmake可以提供它,我会对C#项目的“make && make install”功能感兴趣。 – fog 2012-06-07 14:29:55

+0

为此设置后期构建事件并不困难。假设您需要集成到现有的cmake构建系统中,您甚至可以使用cmake configure_file命令来填写正确的安装位置。 – 2012-06-21 18:41:01

+24

CMake生成C#项目有很好的理由。如果您将原生+ C++/CLI + C#项目与CMake完成的大量配置混合在一起,则需要C#项目将CMake中的配置考虑在内,并参考为C++生成的项目并将其包含在正确的解决方案中。 – 2012-06-25 08:31:45

1

您可以用Visual Studio创建一个项目,不是把它拆开,使CMake的使用configure_file命令写(你必须生成一个XML位与源列表中的),并将其与include_external_msproject添加到解决方案(对于其他生成器,您需要创建自定义目标以手动运行msbuild; cmake似乎还不支持这样做)。该项目相当简单,所以应该可以做到这一点。

24

CMake的2.8.9和加起来一TYPE参数include_external_msproject像这样:

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

这让你指定,该项目是C#(魔法GUID以上),否则事情奋斗(see docs)。

除非您直接构建源代码树,否则您可能仍然希望使用模板方法在其他地方提到您的.csproj文件以获取正确的路径。

好消息是,你可以通配符的C#文件在.csproj.template文件像这样:

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

而且你需要像这样在你的CMakeLists.txt向CMake的UNIX风格forwardslash路径分隔符转换成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。

+1

您能给出一个完整的示例(或链接到一个)如何:(1)复制源C#文件夹和文件; (2).csproj.template以及如何使用它;和(3)如何更新CMakeLists.txt来完成所有这些工作? – 2013-04-03 15:53:17

+3

您不需要复制C#源文件夹/文件 - 它们就地引用。 csproj.template文件与任何其他csproj文件相同,但上面提到的通配符除外。只需复制一个。我已经将实际的CONFIGURE_FILE命令添加到我的答案中,这是唯一缺少的东西。 – 2013-04-04 18:01:46

+0

我需要一个额外的CMakeLists.txt在我的C#文件夹或做所有这些变化发生在根CMakeLists.txt? 如果它们发生在根CMakeLists.txt中,是否在调用include_external_msproject()之前或之后放置它们? – 2013-04-04 19:24:50

16

截至CMake 3.8.2,CSHARP项目生成正式CMake的支持。

要创建默认的Visual Studio 2017年使用CMake的,如下创建CMakeList.txt文件生成的C#/ WPF项目。

  • 项目申报

    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") 
    

对于工作示例,请参阅https://github.com/bemehiser/cmake_csharp_wpf_example