gpt4 book ai didi

c# - CPack NuGet 包

转载 作者:行者123 更新时间:2023-12-04 13:35:33 24 4
gpt4 key购买 nike

语境

我有一个使用 CMake 3.17 构建的托管 C++/CLR 库,并使用 CPack 打包到 NuGet 包中。生成的 nupkg 文件无法导入 C# 项目,因为包管理器发出以下错误:“[snip] 包不包含任何与 [.NETFramework,Version=v4.5.2] 兼容的程序集引用或内容文件”。但是,在添加到解决方案时添加对项目的引用,或由构建生成的相应库文件,按预期工作。

C++/CLR 详细信息

当通过 Visual Studio 2017 -> 添加引用手动添加引用时,代码本身是非常基本的,并生成一个可以从另一个项目引用的有效库(可以通过这种方式添加项目或相应的库,它可以在所有项目中使用)相同的)。

代码由类本身组成,AssemblyInfo.cpp 提供了仅描述元数据和版本信息的属性。依赖项仅包括 System、System::Runtime::InteropServices 和大量预构建的 native 库。

我没有添加 .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)

并且支持( native C++)库的安装方式类似:
install (FILES [various..] DESTINATION . COMPONENT MixedCLR)

我还将 CPACK_GENERATOR 设置为“NuGet”,然后使用 cmake --build . --target PACKAGE 从 CLI 运行 PACKAGE 步骤它成功地生成了 nupkg 文件。



NuGet 如何知道要向哪些库添加引用?
  • 是否需要 nuspec 文件?如果是这样,它必须至少包含哪些内容,以及如何将其包含在 objective-c MakeLists.txt 中?
  • 将托管库以及支持的 native 库放在包的根目录中是否可以接受?如果没有,他们应该去哪里?
  • nupkg 文件中通常是否包含任何其他文件?

  • 最后,如果有人对 C++/CLR 中的打包和多目标有任何了解以支持不同的框架版本/架构/构建配置,我们将不胜感激。

    最佳答案

    How does NuGet know what libraries to add a reference to?



    NuGet 主要从包结构中推断要引用的库。托管程序集必须放在 libs/<TFWM> 目录中哪里 TFWM是目标框架名称(例如:.NET Framework 4.5.2 => net452)。

    Is a nuspec file required? If so, what must minimally be included in it, and how do I include it in the target CMakeLists.txt?


    nuspec 文件由 CPack 在包生成时自动生成。生成的文件保存到输出目录,并会保留 install指定的目录结构。命令。

    Is it acceptable to put the managed library, along with supporting native libraries, in the root of the package? If not, where should

    they go?



    如前所述,托管库位于 libs/blah .另一方面,本地库进入 runtimes/<RID>/native哪里 RID是运行时 ID。就我而言,我想以 Windows 64 位为目标,因此运行时 ID 是 win-x64 .

    Are any other files generally included in a nupkg file?


    为方便起见,我捆绑了 PDB,但我不需要指定任何其他文件或属性。

    Finally, if anyone knows anything about packaging and multi-targeting in C++/CLR to support different framework versions / architectures / build configurations, any notes on that would be highly appreciated.



    如果针对多个框架版本,则只需在各自的文件夹中创建和安装多个目标,就没有什么比这更复杂的了。

    最后,我完成的包结构如下所示:
    libs/
    net452/
    ManagedLib.dll
    ManagedLib.pdb
    runtimes/
    win-x64/
    native/
    NativeLib1.dll
    NativeLib2.dll
    ...

    我希望这对 future 的人有所帮助。

    关于c# - CPack NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62265312/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com