我创建了一个C++/CLI(混合)程序集,其中有一个托管的包装类封装了一些非托管的C++代码。托管部分的目标是.NET 4.6.1,我有一个文件entry.cpp
只有这一行来实现这个:
[assembly:System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.6.1", FrameworkDisplayName = L".NET Framework 4.6.1")];
现在我手动将编译后的程序集包含在.NET 4.6.1项目中,我可以按预期使用托管类。
该项目可以通过四种方式构建:x86或x64作为debug或release版本。 它没有托管依赖项。
现在我想要一个(如果需要多个)NuGet软件包,我可以上传到我的Feed中,并轻松地在任何我想要的.NET 4.6.1兼容项目中使用包装器程序集。我该如何实现这一点?
到目前为止,我尝试了两种方法:
首先,我创建了一个.autopkg
文件,根据这篇博客文章提供本机DLL的方法。该文件的files
部分如下所示:
files {
// include: { *.h };
[x86,v120,release] {
symbols: { ..\Release\*.pdb; }
bin: { ..\Release\*.dll; }
};
[x86,v120,debug] {
symbols: { ..\Debug\*.pdb; }
bin: { ..\Debug\*.dll; }
};
};
这个过程会生成三个.nupkg
文件,我可以上传到我的资源库。但是当我尝试将该包安装到.NET 4.6.1项目时,会出现以下错误信息:
无法安装包'MyCppCliWrapper.redist 1.0.0.2'。您正在尝试将此包安装到针对“.NET Framework, Version = v4.6.1”的项目中,但该包不包含与该框架兼容的任何程序集引用或内容文件。有关更多信息,请联系软件包作者。
所以我重新考虑了一下是否应该使用托管程序集的方式来创建
.nupkg
,因为该程序集具有我想要从托管代码使用的托管类。我创建了一个.nuspec
(使用nuget spec
),并提供了元数据。然后我尝试按照以下方式创建我的包:nuget pack MyCppCliWrapper.nuspec -Prop Configuration=Release -Prop Platform=x86 -Build
然而,这会生成一个包含整个项目的所有源文件和临时文件的软件包,就像该文件夹的 zip 文件一样。
显然,还缺少有关目标框架的元信息。
当我尝试使用项目文件创建软件包(就像使用 C# 程序集那样)时,这也失败了:
请指定一个 nuspec、project.json 或 project 文件以供使用
NuGet 不支持 C++ 项目文件 .vcxproj
(我正在使用 NuGet 3.5.0.1938 命令行实用程序)。
我需要手动构建并在 .nuspec
的 files
部分提供所有文件吗? 如果是的话,他如何知道此行中的 DLL 是哪个 .NET 框架加平台的文件?
<file src="bin\**\*.dll" target="lib" />
我相信Hans Passant是正确的,这只是一个普通的托管nuget包,但打包程序不处理.vcxproj
文件,所以我自己编写了.nuspec
文件:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
<file src="readme.txt" target="" />
<file src="bin\Win32\Release\*.dll" target="lib\net461" />
<file src="bin\Win32\Release\*.pdb" target="lib\net461" />
</files>
</package>
这种生成的软件包可行。
还有一个问题:我是否需要制作两个软件包,一个用于32位系统,另一个用于64位系统?或者是可以将它们包含在一个软件包中(我更喜欢这种方式),并且让使用者根据目标架构(any-cpu mostly 32bit)使用其中之一?
.nuspec
编辑了问题 - 我可以为32位和64位架构拥有一个软件包吗? - ZoolWay