gpt4 book ai didi

c++-cli - 为 C++/CLI(混合)程序集创建 NuGet 包

转载 作者:行者123 更新时间:2023-12-04 04:15:47 29 4
gpt4 key购买 nike

我创建了一个 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 作为调试或发布构建。它没有托管依赖项。

现在我想要一个(或者如果需要多个)NuGet 包,我可以将其上传到我的提要并在我想要的每个 .NET 4.6.1 兼容项目中轻松使用包装器程序集。 我如何实现这一目标?

到目前为止,我尝试了两种方法:

首先,我创建了一个 .autopkg文件是根据 this blog post提供 native 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 项目时,我收到以下错误消息:

Could not install package 'MyCppCliWrapper.redist 1.0.0.2'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.6.1', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.



所以我重新考虑是否应该使用托管程序集的方式来创建 .nupkg因为程序集有一个我想从托管代码中使用的托管类。我创建了一个 .nuspec (使用 nuget spec )并提供元数据。然后我尝试像这样创建我的包:
nuget pack MyCppCliWrapper.nuspec -Prop Configuration=Release -Prop Platform=x86 -Build

但这会生成一个包含整个项目以及所有源文件和临时文件的包,就像该文件夹的 zip 文件一样。

显然也缺少有关目标框架的元信息。

当我尝试使用项目文件创建包(如使用 C# 程序集)时,这也会失败:

Please specify a nuspec, project.json, or project file to use



C++ 项目文件, .vcxproj ,似乎不受 NuGet 支持(我使用的是 NuGet 3.5.0.1938 命令行实用程序)。

我是否需要手动构建并提供 files 中的所有文件? .nuspec的部分?如果是,他如何从这一行中知道哪个 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 主要是 32 位)?

最佳答案

我不知道这是否仍然可以帮助您,但我已经设法打包了 x64 和 x86 C++ 代码,以及在 AnyCPU 上编译的 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

项目.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>

项目目标:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)\$(Platform)\*.*" />
<Content Include="@(NativeLibs)">
<Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

请注意 $(Platform),它是在 Visual Studio 上构建的平台名称所在的位置,这就是我将 C++ DLL 分隔在与 Visual Studio 中的平台同名的文件夹中的原因。

根据文档( https://docs.microsoft.com/en-us/nuget/create-packages/native-packages ),所有 native DLL 都必须放在\build 目录中。

Native NuGet packages targeting native then provide files in \build, \content, and \tools folders; \lib is not used in this case (NuGet cannot directly add references to a C++ project). A package may also include targets and props files in \build that NuGet will automatically import into projects that consume the package. Those files must be named the same as the package ID with the .targets and/or .props extensions.



因此,只需根据您在 .NET 项目和您的集合上支持的平台调整文件夹名称。

关于c++-cli - 为 C++/CLI(混合)程序集创建 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893161/

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