首页 > 解决方案 > 如何解决“错误 MSB3188:程序集 ... 必须经过强签名才能被标记为先决条件。”

问题描述

我在这个板上看到了几个类似的问题,但我认为有几个问题会导致此消息,而我的特定问题可能不在其中,当然我的解决方案看起来比其他任何一个都简单和有效。

我有一个使用 packages.config 的项目。

我使用 Visual Studio UI 将项目引用从 package.config 迁移到 PackageReference ( https://devblogs.microsoft.com/nuget/migrate-packages-config-to-package-reference/ )。我这样做是因为它允许使用 msbuild /t:restore mysln.sln 进行构建——这不适用于 packages.config。

我认为这通常有效(我在其他项目上尝试了 5 或 6 次)。但是在我重建的一个项目中,我收到了错误消息:

c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VisualStudio\v16.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets(236,9): error MSB3188: Assembly 'C:\Users\lew
is\.nuget\packages\mousekeyhook\5.6.0\lib\net40\Gma.System.MouseKeyHook.dll' must be strong signed in order to be marked as a prerequisite.

标签: c#.netpackagereference

解决方案


有关要求签名的程序集的错误消息通常显示在以下组合中:

  • 可以发布项目(例如 VSTO 项目)。
  • 该项目使用 NuGet 的 PackageReferences。
  • 引用的 NuGet 包是 netstandard2.0 包。

您可以通过创建新的 VSTO Word 加载项并通过 NuGet 引用 NGenerics 版本 1.5.3 轻松重现此问题。

(另一个原因可能是引用程序集的版本冲突,假设您通过 NuGet 引用程序集 A 和 B,而 A 本身引用了不同版本的 B;那么您将不得不引用与 A 相同的 B 版本。)

在 Microsoft 服务调用的帮助下,我们发现在这种情况下,引用的程序集(在我们的例子中为 NGenerics v. 1.5.3)被CopyLocal=false构建过程标记为内​​部。如果对 NuGet 使用 packages.config 而不是 PackageReferences 并将引用的程序集标记为CopyLocal=false在“属性”窗口中,则会出现相同的编译错误。

解决方案:使用 packages.config 时,将受影响程序集的程序集引用属性设置为CopyLocal=true. 使用 PackageReferences 时,手动编辑项目文件并添加 assets 选项,如下例所示:

    <PackageReference Include="NGenerics">
      <Version>1.5.3</Version>
      <ExcludeAssets>compile</ExcludeAssets>
    </PackageReference>

ExcludeAssetsIncludeAssets设置的名称具有误导性。ExcludeAssets正在将提到的项目复制到输出,同时IncludeAssets阻止它们进入输出目录。你也可以说<IncludeAssets>none</IncludeAssets>请参阅https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files上的文档


推荐阅读