0

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

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

3 回答 3

2

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

  • 可以发布项目(例如 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上的文档

于 2020-01-02T12:01:58.090 回答
1

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

  • 从包文件夹中删除 Gma.System.MouseKeyHook.dll
  • 从 nuget 中删除对 Gma.System.MouseKeyHook.dll 的引用
  • 添加一个名为“ThirdPartyComponents”的文件夹并将 Gma.System.MouseKeyHook.dll 放在那里。
  • 使用 Visual Studio 中的“添加引用”命令创建 REFERENCE(不是 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>

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

于 2019-11-21T17:34:45.323 回答
0

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

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

您可以通过投票来鼓励对 PackageReferences 的支持: 在 Visual Studio 2019 中创建的 VSTO 项目不支持将包引用作为包管理格式

于 2020-01-16T10:59:55.197 回答