You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CMake配置CSharp项目NuGet包引用问题及相关实现咨询

我来帮你解决这几个CMake配置CSharp项目时遇到的NuGet相关问题,都是实际开发中常见的坑,咱们一步步来:

1. 解决手动指定DLL引用后需双击才能编译的问题

你现在用VS_DOTNET_REFERENCES硬编码DLL路径的方式,核心问题是CMake生成的项目文件没和NuGet的还原流程绑定,Visual Studio无法自动感知这个引用的有效性,所以得手动触发确认。

更靠谱的做法是让CMake直接通过NuGet包名管理引用,CMake 3.12+版本支持VS_DOTNET_PACKAGE_REFERENCES属性,它会自动处理NuGet包的还原和引用,完全不用手动找DLL:

set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_PACKAGE_REFERENCES "ExcelDna.Integration, Version=0.34.6")

如果用了这种方式还是有问题,可能是CMake生成项目后NuGet还没完成还原,可以加个自定义目标强制触发还原:

add_custom_target(NuGetRestore
    COMMAND nuget restore ${PROJECT_NAME}.sln
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Restoring NuGet packages..."
)
add_dependencies(${PROJECT_NAME} NuGetRestore)

这样编译项目前CMake会自动执行NuGet还原,不用再手动操作。

2. 不依赖版本号的NuGet包引用方式

有两种实用方式能摆脱硬编码版本号:

  • 使用版本范围:在VS_DOTNET_PACKAGE_REFERENCES里指定版本范围,让Nu自动选符合要求的最新包:

    set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_PACKAGE_REFERENCES "ExcelDna.Integration, Version>=0.34.6")
    

    后续更新包时不用改CMake代码,NuGet会自动匹配最高兼容版本。

  • 动态查找本地包路径:如果包还原到本地packages目录,用CMake的文件查找功能自动定位最新版本:

    file(GLOB EXCELDNA_INTEGRATION_PKG "${CMAKE_CURRENT_SOURCE_DIR}/packages/ExcelDna.Integration.*")
    list(SORT EXCELDNA_INTEGRATION_PKG COMPARE NATURAL ORDER DESCENDING)
    list(GET EXCELDNA_INTEGRATION_PKG 0 EXCELDNA_INTEGRATION_LATEST)
    set(EXCELDNA_INTEGRATION_DLL "${EXCELDNA_INTEGRATION_LATEST}/lib/ExcelDna.Integration.dll")
    set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_REFERENCES "${EXCELDNA_INTEGRATION_DLL}")
    

    这段代码会自动找到packages里最新的ExcelDna.Integration包,再引用对应DLL。

3. 添加ExcelDna.AddIn所需的ExtensionTargets

ExcelDna.AddIn这类包会自带.targets/.props文件扩展构建流程,在CMake里可以这么处理:

  • 用PackageReference自动导入:如果用VS_DOTNET_PACKAGE_REFERENCES引用ExcelDna.AddIn,CMake会自动处理包内的.targets文件导入,不用额外操作:

    set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_PACKAGE_REFERENCES "ExcelDna.AddIn, Version>=0.34.6")
    

    这是最省心的方式,NuGet会自动把.targets文件加入项目构建依赖。

  • 手动导入.targets文件:如果还是用手动指定DLL的方式,先找到包内的.targets文件,再通过CMake添加到项目的导入目标:

    # 定位最新版本的ExcelDna.AddIn包
    file(GLOB EXCELDNA_ADDIN_PKG "${CMAKE_CURRENT_SOURCE_DIR}/packages/ExcelDna.AddIn.*")
    list(SORT EXCELDNA_ADDIN_PKG COMPARE NATURAL ORDER DESCENDING)
    list(GET EXCELDNA_ADDIN_PKG 0 EXCELDNA_ADDIN_LATEST)
    set(EXCELDNA_ADDIN_TARGETS "${EXCELDNA_ADDIN_LATEST}/build/ExcelDna.AddIn.targets")
    
    # 将.targets文件加入项目导入目标
    set_property(TARGET ${PROJECT_NAME} PROPERTY VS_GLOBAL_ImportBeforeTargets "${EXCELDNA_ADDIN_TARGETS}")
    

    这样Visual Studio构建时会自动加载这个.targets文件,处理ExcelDna.AddIn的扩展构建逻辑。

内容的提问来源于stack exchange,提问作者Max

火山引擎 最新活动