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

时间:2019-11-21 17:34:45

标签: c# .net packagereference

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

我有一个正在使用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.

3 个答案:

答案 0 :(得分:1)

我对这个问题的解决方案:

  • 松开包文件夹中的Gma.System.MouseKeyHook.dll
  • 从nuget删除对Gma.System.MouseKeyHook.dll的引用
  • 添加一个名为“ ThirdPartyComponents”的文件夹,并将Gma.System.MouseKeyHook.dll放入其中。
  • 在Visual Studio中使用“添加引用”命令创建引用(不是PackageReference)

完成-错误消失了。

.CSPROJ DIFF FOR FIX:
index f0abf00..f87ab3e 100644
--- a/X.csproj
+++ b/X.csproj
@@ -123,6 +123,9 @@
   -->
   <ItemGroup>
     <Reference Include="Accessibility" />
+    <Reference Include="Gma.System.MouseKeyHook">
+      <HintPath>..\ThirdPartyComponents\Gma.System.MouseKeyHook.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
       <EmbedInteropTypes>True</EmbedInteropTypes>
     </Reference>
@@ -632,9 +635,6 @@
     <PackageReference Include="log4net">
       <Version>2.0.8</Version>
     </PackageReference>
-    <PackageReference Include="MouseKeyHook">
-      <Version>5.6.0</Version>
-    </PackageReference>
     <PackageReference Include="Newtonsoft.Json">
       <Version>12.0.3</Version>
     </PackageReference>

显然拥有a需要签名内容,而拥有常规则不需要签名。

答案 1 :(得分:0)

有关所需的已签名程序集的错误消息通常以以下组合显示:

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

您可以通过创建一个新的VSTO Word加载项并通过NuGet引用NGenerics版本1.5.3轻松地重现这一点。

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

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

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

    <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

上的文档

答案 2 :(得分:0)

我保留了其他答案,因为它可能对其他项目有所帮助。但是,对于VSTO,情况是根据我们提出的Microsoft支持案例得出的:

    VSTO项目不支持
  • PackageReferences。您必须使用packages.config
  • 具有PackageReferences的非VSTO项目的ClickOnce部署有效(由Microsoft升级工程师报告)。

您可以通过以下方式鼓励对PackageReferences的支持: VSTO projects created in Visual Studio 2019 do not support Package Reference as the package management format