Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 为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: {

当我现在在.NET4.6.1项目中手动包含编译后的程序集时,我可以按预期使用托管类

该项目可以通过四种方式构建:x86或x64作为调试构建或发布构建。它没有托管依赖项

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


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

首先,我创建了一个
.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++项目文件, vcxProj> <代码>,似乎不受NuGet支持(我使用NuGue3.5.0.1938命令行实用程序)。

我是否需要手动生成并在
.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相同(更多信息请参见此处:)