如何使Visual Studio安装项目检测与生成一致的nuget依赖项?

我使用microsoft Visual Studio安装程序项目(0.9.3,这是Visual Studio 2019的最新版本)创建了一个安装项目。执行安装程序后,它将安装与构建过程中生成的程序集不同的Nuget程序集程序集。

为什么这样做,如何选择与构建程序集一致的程序集?

我的应用程序适用于4.7.2框架。典型示例是System.ValueTuple.dll(4.0.2)

Build从以下位置检索程序集:     C:\ Users \ .nuget \ packages \ system.valuetuple \ 4.5.0 \ lib \ net47 \ System.ValueTuple.dll

Install从以下位置检索程序集:     C:\ Program Files(x86)\ Reference Assemblys \ microsoft \ Framework.NETFramework \ v4.7.2 \ Facades \ System.ValueTuple.dll

虽然基于4.0.2的安装会引起关注,但可以解决,但是当我将nuget软件包升级到4.6版(并将程序集升级到4.0.3)时,请安装开关以使用程序集C:\ Users \ vgdev.nuget \ packages \ system。 valuetuple \ 4.5.0 \ ref \ net47 \ System.ValueTuple.dll

如果您仔细看,您会注意到上面的路径有\ ref文件夹,并且包含“引用”程序集。参考程序集不是要安装的,并且会导致错误BadImageformatException。

Nuget软件包升级后的构建继续从正确的\ lib文件夹中提取软件包,并且应用程序运行正常。因此,我要做的是使安装程序与build保持一致。有什么建议吗?

cx3232 回答:如何使Visual Studio安装项目检测与生成一致的nuget依赖项?

  

Install从以下位置检索程序集:C:\ Program Files(x86)\ Reference   程序集\ Microsoft \ Framework.NETFramework \ v4.7.2 \ Facades \ System.ValueTuple.dll

您以哪种方式引用该软件包?我只能在手动添加引用时重现此问题。(右键单击project => Add reference => Browse ...)。如果这样做,请删除该引用,并以{{3} }。

  

我的应用程序适用于4.7.2框架。典型的例子是   System.ValueTuple.dll(4.0.2)。当我将nuget软件包升级到4.6版(并将程序集升级到4.0.3版)

我只能在这里用Nuget Package Manager UI找到它。而且我认为它包含程序集版本4.0.3而不是4.0.2。

(我猜想,当VS识别出您的程序集版本时,在大多数计算机中它会显示4.0.3,而在一台计算机上它会显示4.0.2,这很奇怪...)

  

Nuget软件包升级后的构建继续从   正确的\ lib文件夹和应用程序可以正常工作。所以我想   这样做是为了使安装程序与build保持一致。有什么建议吗?

问题原因:

这种奇怪的行为可能与安装项目有关。我可以重现同样的情况,我发现仅当我使用PackageReference格式来管理应用程序中的nuget程序包时才会出现此问题。(。net 4.7.2)

PackageReference格式是VS2017之后的新nuget软件包管理格式。我不确定安装项目是否完全支持它。

以下两条建议可能会有所帮助:

1 。我发现此问题仅在使用PackageReference格式时发生。因此,您可以尝试在应用程序中使用Packages.config格式。而且我已经检查了安装项目,可以很好地识别这种格式。

卸载所有PackageReference格式的软件包,然后转到Tools=>Nuget Packages Manager=>Nuget Package ManagerAllow format selection...设置为true。

Clean all nuget cache,然后单击ok。之后,删除bin和obj文件夹,然后重新启动VS以使用Packages.config格式添加这些软件包。

2 。如果您继续使用PackageReference格式。尝试从ref文件夹中排除该程序集,然后通过Add=>Assembly=>Browse从lib文件夹中手动添加该程序集。

latest 4.5.0

注意:由于安装项目可能不完全支持packageReference格式项目,因此实际上我认为#1可能更适合您的情况。然后,您可以创建一个具有packages.config格式的新简单项目,以检查Packages.config格式是否可以解决问题。希望对您有所帮助:)

,

问题的根本原因似乎是 Visual Studio 设置项目使用了 BuiltProjectOutputGroupDependencies 目标,而不是 ReferenceCopyLocalPathsOutputGroup 目标(请参阅 PackageReferences put ref instead of lib assemblies in the output group used by VS installer projects)。

建议的解决方法是覆盖主项目的项目文件末尾的 BuiltProjectOutputGroupDependencies 目标:

<Target
Name="BuiltProjectOutputGroupDependencies"
DependsOnTargets="$(BuiltProjectOutputGroupDependenciesDependsOn)"
Returns="@(BuiltProjectOutputGroupDependency)">
<ItemGroup>
    <BuiltProjectOutputGroupDependency Include="@(ReferenceCopyLocalPaths->'%(FullPath)');
                                          @(ReferenceDependencyPaths->'%(FullPath)');
                                          @(NativeReferenceFile->'%(FullPath)');
                                          @(_DeploymentLooseManifestFile->'%(FullPath)');
                                          @(ResolvedIsolatedComModules->'%(FullPath)');
                                          @(ReferenceComWrappersToCopyLocal->'%(FullPath)')"/>
</ItemGroup>
</Target>
本文链接:https://www.f2er.com/3157386.html

大家都在问