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




