使用 Pinvoke 和复制 DLL 的 C++ 和 C# .NET6 SDK 项目的 CMake

Mat*_*att 7 c# cmake

我有一个使用 c/c++ 中的本机组件的项目,以及一些使用 .NET 的 Windows 托管项目,该项目使用 p/invoke 调用本机 DLL。所以我想要一个 cmake 生成的 .NET C# 项目,它将构建托管代码复制它所需的本机 DLL,以便无需其他步骤即可运行它(例如直接在 Visual Studio 中构建和运行测试)。

这是通过添加自定义命令来复制 DLL 来与 .NET 4.8 一起使用,但我最近想尝试使用 SDK 风格的 vs 项目来尝试 .NET 6:

set_target_properties(${this_target} PROPERTIES
    DOTNET_SDK "Microsoft.NET.Sdk"
    DOTNET_TARGET_FRAMEWORK "net6.0")
Run Code Online (Sandbox Code Playgroud)

我之前复制本机 DLL 的解决方案是定义一个像这样的自定义函数,它可以复制所需的 DLL:

# in the native cmakelist for my dll with target name native_dll:
function(copy_native_dlls target output_directory)
    add_custom_command(TARGET ${target} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${build_binaries_path}/$<CONFIG>/native_dll/native1.dll ${output_directory}
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${build_binaries_path}/$<CONFIG>/native_dll/native1.pdb ${output_directory}
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${build_binaries_path}/$<CONFIG>/native_dll/native2.dll ${output_directory}
        DEPENDS native_dll
        COMMENT "copying native DLLs"
    )
endfunction()
Run Code Online (Sandbox Code Playgroud)

在每个托管项目中,我会在需要时添加以下内容:

copy_native_dlls(${this_target} $<TARGET_FILE_DIR:${this_target}>)
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试使用 SDK 风格的项目迁移到 .NET 6 时,我无法再使用add_custom_commandDOTNET_SDK 文档

注意 此版本的 CMake 中的 Visual Studio 生成器尚未学会支持 .NET SDK 样式项目中的 add_custom_command()。目前,将自定义命令附加到设置了 DOTNET_SDK 属性的目标是错误的。

是否有其他方法可以将我的项目中构建的 .DLL 添加到另一个项目,以便在构建它时将其复制到输出目录?我希望有某种方法可以在 cmake 中指向这些 dll 并正确设置依赖项

小智 0

我知道这听起来不对,但我能让它发挥作用的唯一方法就是这个

add_custom_target(${this_target}
    COMMAND ${CMAKE_COMMAND} -E copy
  "$<TARGET_FILE:${TARGETFILE}>"
  "$<TARGET_FILE_DIR:${TARGETDIR}>"
)
set_target_properties(${this_target} PROPERTIES VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.7.1"
    VS_GLOBAL_ResolveNuGetPackages "false")
add_dependencies(${TARGETDIR} ${this_target})
Run Code Online (Sandbox Code Playgroud)