【发布时间】:2020-09-27 14:38:19
【问题描述】:
上下文
我有一个使用 CMake 3.17 构建并使用 CPack 打包到 NuGet 包中的托管 C++/CLR 库。生成的 nupkg 文件无法导入 C# 项目,因为包管理器发出以下错误:“[snip] 包不包含任何与 [.NETFramework,Version=v4.5.2] 兼容的程序集引用或内容文件] ”。但是,在添加到解决方案时添加对项目或构建生成的相应库文件的引用可以按预期工作。
C++/CLR 细节
代码本身是非常基本的,并生成一个可以从另一个项目引用的有效库,当通过 Visual Studio 2017 手动添加引用时 -> 添加引用(可以通过这种方式添加项目或相应的库,并且都一样)。
代码由类本身组成,AssemblyInfo.cpp 提供仅描述元数据和版本信息的属性。依赖项仅包括 System、System::Runtime::InteropServices 和大量预构建的本地库。
我没有添加 .nuspec 文件,也没有添加 nuget.config 文件,我相信后者是由 CPack NuGet 生成器在构建包时生成的。
CMake / CPack 详细信息
CPack NuGet 支持相对较新,我未能成功找到一个工作示例,但我成功地生成了一个 nupkg 文件。首先指示 CMake 使用包含的源文件构建托管 C++ 库,并在相应的目标 ManagedLibrary 上设置以下属性:
set_target_properties (ManagedLibrary PROPERTIES DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2")
set_target_properties (ManagedLibrary PROPERTIES COMMON_LANGUAGE_RUNTIME "")
文档指出这将生成 CLR/混合代码并按照宣传的方式工作,因此我能够成功地针对目标框架进行构建。下一步是将库安装在我认为正确的位置:
install (TARGET ManagedLibrary DESTINATION . COMPONENT MixedCLR)
并且支持(本机 C++)库的安装方式类似:
install (FILES [various..] DESTINATION . COMPONENT MixedCLR)
我还将 CPACK_GENERATOR 设置为“NuGet”,然后使用成功生成 nupkg 文件的 cmake --build . --target PACKAGE 从 CLI 运行 PACKAGE 步骤。
问题
NuGet 如何知道要向哪些库添加引用?
- 是否需要 nuspec 文件?如果是这样,其中必须至少包含什么,以及如何将其包含在目标 CMakeLists.txt 中?
- 是否可以将托管库以及支持的本机库放在包的根目录中?如果没有,他们应该去哪里?
- nupkg 文件中是否通常包含任何其他文件?
最后,如果有人知道有关在 C++/CLR 中打包和多目标以支持不同框架版本/架构/构建配置的任何信息,我们将不胜感激。
【问题讨论】:
-
这是一个非常受欢迎的链接,我特别感谢包含详细文档。我会仔细研究一下,然后再报告。