.net 如何解决“错误MSB3188:程序集...必须进行强签名,才能标记为先决条件,”

jhdbpxl9  于 2022-11-19  发布在  .NET
关注(0)|答案(4)|浏览(206)

我在这个板上看到了几个类似的问题,但我认为有几个问题可能会导致这个信息,而我的特定问题可能不在其中,当然我的解决方案看起来比其他任何问题都简单和有效。
我有一个使用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.
q3qa4bjr

q3qa4bjr1#

有关要求的已签名程序集的错误消息通常以下列组合形式显示:

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

您可以通过创建一个新的VSTO Word外接程序并通过NuGet引用NGenerics Version 1.5.3来轻松地重现此问题。
(另一个原因可能是被引用程序集的版本冲突,比如您通过NuGet引用程序集A和B,而A本身引用了B的不同版本;则必须引用与A相同的B版本。)
在Microsoft服务调用的帮助下,我们发现在这样的场景中,引用的程序集(在我们的例子中是NGenerics v. 1.5.3)被构建过程内部标记为CopyLocal=false。如果您使用packages.config而不是PackageReferences for NuGet,并在“属性”窗口中将引用的程序集标记为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://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files处的文档

fquxozlt

fquxozlt2#

我对这个问题的解决办法是:

  • 从软件包文件夹中取出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>

显然,有一个需要签名的东西,但有一个经常不。

hfsqlsce

hfsqlsce3#

我保留我的另一个答案,因为它可能有助于其他项目。然而,对于VSTO,情况是根据我们提出的微软支持案例:

  • 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

643ylb08

643ylb084#

在我的例子中,我将项目升级到.net 4.7.2,但仍然在旧的VS版本(2015)中构建。当我在VS 2019中构建项目时,构建失败消失了

相关问题