C++ cli 为C+创建NuGet包+/CLI(混合)程序集 我创建了一个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")];
当我现在在.NET4.6.1项目中手动包含编译后的程序集时,我可以按预期使用托管类 该项目可以通过四种方式构建:x86或x64作为调试构建或发布构建。它没有托管依赖项 现在我想要一个(或者如果需要多个)NuGet包,我可以将其上传到我的提要,并在我想要的每个.NET4.6.1兼容项目中轻松使用包装程序集我如何做到这一点?C++ cli 为C+创建NuGet包+/CLI(混合)程序集 我创建了一个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")];,c++-cli,nuget,C++ Cli,Nuget,当我现在在.NET4.6.1项目中手动包含编译后的程序集时,我可以按预期使用托管类 该项目可以通过四种方式构建:x86或x64作为调试构建或发布构建。它没有托管依赖项 现在我想要一个(或者如果需要多个)NuGet包,我可以将其上传到我的提要,并在我想要的每个.NET4.6.1兼容项目中轻松使用包装程序集我如何做到这一点? 到目前为止,我尝试了两种方法: 首先,我创建了一个.autopkg文件,它符合提供本机DLL的方式。该文件的文件部分如下所示: files { // include: {
到目前为止,我尝试了两种方法: 首先,我创建了一个
.autopkg
文件,它符合提供本机DLL的方式。该文件的文件
部分如下所示:
files {
// include: { *.h };
[x86,v120,release] {
symbols: { ..\Release\*.pdb; }
bin: { ..\Release\*.dll; }
};
[x86,v120,debug] {
symbols: { ..\Debug\*.pdb; }
bin: { ..\Debug\*.dll; }
};
};
nuget pack MyCppCliWrapper.nuspec -Prop Configuration=Release -Prop Platform=x86 -Build
这个过程会产生三个.nupkg
文件,我可以将它们上传到我的提要。但当我尝试将该软件包安装到.NET 4.6.1项目时,会收到以下错误消息:
无法安装程序包“MyCppCliWrapper.redist 1.0.0.2”。您正试图将此程序包安装到以“.NETFramework,Version=v4.6.1”为目标的项目中,但该程序包不包含任何与该框架兼容的程序集引用或内容文件。有关更多信息,请联系软件包作者
因此,我重新考虑是否不应该使用托管程序集的方法来创建
.nupkg
,因为该程序集有一个托管类,我想从托管代码中使用。我创建了一个.nuspec
(使用nuget spec
)并提供了元数据。然后,我尝试创建我的包,如下所示:
files {
// include: { *.h };
[x86,v120,release] {
symbols: { ..\Release\*.pdb; }
bin: { ..\Release\*.dll; }
};
[x86,v120,debug] {
symbols: { ..\Debug\*.pdb; }
bin: { ..\Debug\*.dll; }
};
};
nuget pack MyCppCliWrapper.nuspec -Prop Configuration=Release -Prop Platform=x86 -Build
但这会产生一个包,其中包含整个项目以及所有源文件和临时文件,就像该文件夹的zip文件一样
显然,也缺少关于目标框架的元信息
当我尝试使用项目文件创建包(如C#Assembly)时,这也会失败:
请指定要使用的nuspec、project.json或项目文件
C++项目文件,
.nuspec
的文件部分提供所有文件?如果是,他如何从这行代码中知道哪个DLL是针对哪个.NET framework plus平台的
<file src="bin\**\*.dll" target="lib" />
以这种方式生成的包可以工作
还有一个问题:这样的话,我是否必须做两个包,一个32位,一个64位?或者是否可以将它们包含在一个包中(我更喜欢),并让消费项目根据目标体系结构使用一个或另一个包(任何cpu大多为32位)?我不知道这是否仍然可以帮助您,但是我已经成功地打包了x64和x86 C++代码,以及一个在任意CPU上编译的C *包装器。
在我的C#项目中,我有两个平台:“x86”和“x64”
在我的Nuget文件夹中,我有以下结构:
\Project
\Project.1.0.nuspec
\build
\x64
\*.dll
\*.pdb
\x86
\*.dll
\*.pdb
\Project.targets
\lib
\net452
\Wrapper.dll
\Wrapper.pdb
Project.nuspec:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>Project</id>
<version>1.0</version>
<authors>nilsonneto</authors>
<owners>nilsonneto</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Example.</description>
<references>
<reference file="Wrapper.dll" />
</references>
</metadata>
<files>
<file src="build\Project.targets" target="build\Project.targets" />
<file src="build\x64\**" target="build\x64" />
<file src="build\x86\**" target="build\x86" />
<file src="lib\net452\Wrapper.dll" target="lib\net452\Wrapper.dll" />
<file src="lib\net452\Wrapper.pdb" target="lib\net452\Wrapper.pdb" />
</files>
</package>
项目
1
),所有本机DLL必须放在\build目录中
然后,以本机为目标的本机NuGet包在\build、\content和\tools文件夹中提供文件\在此情况下不使用LIB(NuGET不能直接向C++项目添加引用)。包还可能包括\build中的目标和道具文件,NuGet将自动将这些文件导入到使用包的项目中。这些文件的名称必须与扩展名为.targets和/或.props的包ID相同
因此,只需根据您在.NET项目和集合上支持的平台调整文件夹名称。可能重复@HansPassant,我倾向于说不,因为我的包中没有普通的托管程序集,只有带有托管类的C++/CLI。但我也尝试了一些来自该帖子的报告,你只是遵循了错误的教程,它只适用于纯本地C++项目。您也不能在IDE中添加对本机DLL的引用。C++/CLI程序集仍然是.NET程序集,并且与任何其他.NET程序集一样具有元数据,这一点更为重要。解决Nuget packager无法处理.vcxproj文件的限制是必要的。@HansPassant是的,看起来你是对的。我用我的.nuspec
-我能有一个32位和64位体系结构的包吗?@ZoolWay-“还有一个问题:这样,我必须做两个包,一个32位,一个64位”-你有没有弄明白或者得到答案?如果有一些翻译文件(取决于语言)他们会在nuget的道路上走到哪里?在我的场景中,英语和德语下的xml文件很少。对于我的本机库/应用程序。我正在将基于x64的应用程序放在build\native\x64*.dll下,那么翻译文件应该放在哪里?感谢这个本地C++或CLI?你能告诉我更多关于包装器的信息吗?你如何在任何CPU上支持消费者platform@Zenwalker我相信你可以把这些文件放在内容上,根据任何地方“已复制到项目根目录。将content文件夹视为最终使用包的目标应用程序的根。要让软件包在应用程序的/images文件夹中添加图像,请将其放置在软件包的content/images文件夹中。“JJUBPAWLIKSY”的包装器是在C语言上构建的C++ DLL,平台被设置为ANYCPU,因为控制它访问的DLL的是N.NESPEC。至于对AnyCPU平台的支持,我不太清楚您的意思,因为它基本上与x86相同(更多信息请参见此处:)