将DLL参考添加到基于CMake的C#项目

时间:2018-07-18 10:44:12

标签: c# cmake

我正在使用CMake生成C#Wpf项目。我遵循以下示例https://github.com/bemehiser/cmake_csharp_wpf_example/blob/master/Example/CMakeLists.txt

我的问题是:如何使用CMake向该项目添加第三方.NET DLL参考?

2 个答案:

答案 0 :(得分:0)

例如,您可以对名为MyLibrary.dll的第三方库尝试以下操作:

add_executable(MyTarget
    #  ... list source files here ...
)

# Add the reference to the 3rd-party library: MyLibrary
set_property(TARGET MyTarget PROPERTY 
    VS_DOTNET_REFERENCE_MyLibrary "/path/to/the/libs/MyLibrary.dll")

答案 1 :(得分:0)

我要添加这个详细的答案,因为当前在高级网页上有很多误导性的示例。 squareskittles的答案是正确的,但未包含对潜在陷阱的详细讨论。

要设置像WindowsBase这样的Visual Studio托管项目.NET引用,请使用cmake目标属性VS_DOTNET_REFERENCES。将多个引用指定为列表而不是单独列表很重要。因此,使用"PresentationCore;WindowsBase;..."或使用cmake列表(如本文底部示例中的示例)是正确的。像在网络上经常看到的那样,单独添加多个引用是 的错误做法:

# this is incorrect, and will only set the first reference, not all:
set_target_properties(${PROJECT_NAME} PROPERTIES VS_DOTNET_REFERENCES
    "PresentationCore"
    "WindowsBase"
    ...)

要添加二进制Visual Studio托管项目.NET参考,建议对每个二进制参考使用一个cmake目标属性VS_DOTNET_REFERENCE_refname。要求将<refname>替换为参考文件名,且不带扩展名。为引用指定其他<refname> 是不正确的:

# this is incorrect, because the refname and the reference file name mismatch:
set_target_properties(${PROJECT_NAME} PROPERTIES VS_DOTNET_REFERENCE_mythriftlib
     "${CMAKE_INSTALL_PREFIX}/bin/Thrift.dll")

最后,同样重要的是,相对于同样有效的set_target_properties(${PROJECT_NAME} ...),我更喜欢使用set_properties(TARGET ${PROJECT_NAME} ...)。无论您选择哪种方式,都可以与自己的CMakeLists.txt保持一致。

这是一个正确的完整示例,可帮助您入门:

project(WPFGui VERSION 0.1.0 LANGUAGES CSharp)

include(CSharpUtilities)

add_executable(${PROJECT_NAME}
    App.config
    App.xaml
    App.cs
    MainWindow.xaml
    MainWindow.cs
    Properties/AssemblyInfo.cs
    Properties/Resources.Designer.cs
    Properties/Resources.resx
    Properties/Settings.Designer.cs
    Properties/Settings.settings)

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.cs
    MainWindow.xaml
    MainWindow.cs)

set_source_files_properties(App.xaml PROPERTIES
    VS_XAML_TYPE "ApplicationDefinition")

set_target_properties(${PROJECT_NAME} PROPERTIES
    DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1")

set_target_properties(${PROJECT_NAME} PROPERTIES
    WIN32_EXECUTABLE TRUE)

LIST(APPEND VS_DOTNET_REFERENCES "Microsoft.CSharp")
LIST(APPEND VS_DOTNET_REFERENCES "PresentationCore")
LIST(APPEND VS_DOTNET_REFERENCES "PresentationFramework")
LIST(APPEND VS_DOTNET_REFERENCES "System")
LIST(APPEND VS_DOTNET_REFERENCES "System.Xaml")
LIST(APPEND VS_DOTNET_REFERENCES "System.Xml")
LIST(APPEND VS_DOTNET_REFERENCES "System.Xml.Linq")
LIST(APPEND VS_DOTNET_REFERENCES "WindowsBase")

set_target_properties(${PROJECT_NAME} PROPERTIES
    VS_DOTNET_REFERENCES "${VS_DOTNET_REFERENCES}"
    VS_DOTNET_REFERENCE_Thrift "${CMAKE_INSTALL_PREFIX}/bin/Thrift.dll")