c# - 如何解决“错误 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.
解决方案
有关要求签名的程序集的错误消息通常显示在以下组合中:
- 可以发布项目(例如 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>
ExcludeAssets
和IncludeAssets
设置的名称具有误导性。ExcludeAssets
正在将提到的项目复制到输出,同时IncludeAssets
阻止它们进入输出目录。你也可以说<IncludeAssets>none</IncludeAssets>
。请参阅https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files上的文档
推荐阅读
- c++ - 忽略模板参数
- python - 我可以在具有自定义损失的多输出模型上使用 Keras model.fit(),该模型使用 Tensorflow 2 中的所有输出目标和预测?
- python - 如何在 Python 中组合 Seaborn 中的两个热图,以便两者都显示在同一个热图中?
- prolog - 不能在多茨维尔数点
- c - 如何将用户定义的系统调用作为函数调用
- node.js - 使用 ts-node 编译 mocha 测试时,我找不到模块 'tsconfig/register'
- python - TypeError:“方法”对象不能解释为整数
- google-cloud-platform - GCP:如何找到在特定时间运行的实例?
- angular - 将属于 innerHTML 的元素替换为另一个元素
- powershell - 用于获取 FIPS 算法状态的 Powershell 脚本