我有一个Managed C ++ / CLR库,它使用CMake 3.17构建,并使用CPack打包到NuGet包中。由于软件包管理器发出以下错误,因此无法将生成的nupkg文件导入C#项目:“ [snip]软件包不包含任何与[.NETFramework,Version = v4.5.2]兼容的程序集引用或内容文件。 ”。但是,添加对项目的引用(添加到解决方案中时)或由构建生成的相应库文件,都可以按预期工作。
代码本身非常基础,并且会生成一个有效的库,当通过Visual Studio 2017手动添加引用时,可以从另一个项目中引用它->添加引用(可以通过这种方式添加项目或相应的库,都一样)。
代码由类本身组成,而AssemblyInfo.cpp提供的属性仅描述元数据和版本信息。依赖项仅包括System,System :: Runtime :: InteropServices和大量预构建的本机库。
我没有添加.nuspec文件,也没有添加nuget.config文件,我相信后者是由CPack NuGet生成器在构建程序包时生成的。
CPack NuGet支持是相对较新的,并且我一直未能找到有效的示例,但是我设法成功生成了一个nupkg文件。首先,指示CMake使用包含的源文件以及在相应目标ManagedLibrary
上设置的以下属性来构建托管C ++库:
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',然后使用cmake --build . --target PACKAGE
从CLI运行PACKAGE步骤,该步骤成功生成了nupkg文件。
NuGet如何知道要添加引用的库?
最后,如果有人对使用C ++ / CLR进行打包和多目标化以支持不同的框架版本/体系结构/构建配置有所了解,那么对此的任何注释将不胜感激。
答案 0 :(得分:0)
NuGet如何知道要添加引用的库?
主要是,NuGet从程序包结构中推断出要引用的库。必须将托管程序集放在libs/<TFWM>
的目录中,其中TFWM
是Target Framework Moniker(例如.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
他们去吗?
如上所述,托管库位于libs/blah
中。另一方面,本机库进入runtimes/<RID>/native
,其中RID
是运行时ID。就我而言,我想定位到64位Windows,因此运行时ID为win-x64
。
Are any other files generally included in a nupkg file?
为了方便起见,我将PDB捆绑在一起,但不需要指定任何其他文件或属性。
最后,如果有人对包装和多目标化有所了解 在C ++ / CLR中支持不同的框架版本/体系结构/ 构建配置,对此的任何注释将不胜感激。
如果针对多个框架版本,这只是在多个文件夹中创建和安装多个目标的情况,没有什么要处理的复杂了。
最后,我完成的包装结构如下:
libs/
net452/
ManagedLib.dll
ManagedLib.pdb
runtimes/
win-x64/
native/
NativeLib1.dll
NativeLib2.dll
...
我希望这对以后的人有所帮助。