为什么我得到'汇编'* .dll'必须签名强,才能被标记为先决条件。'?

时间:2011-02-27 13:39:33

标签: c# visual-studio .net-4.0

我正在尝试使用C#4.0编译我的excel插件,并在Visual Studio中构建项目时开始遇到此问题。告诉你我之前没有遇到过这个问题,这很重要。什么可能导致这种情况发生?

26 个答案:

答案 0 :(得分:263)

当我遇到此问题时,我通过关闭“启用ClickOnce安全设置”来修复它。

菜单:项目| '项目名称'属性... |安全选项卡| “启用ClickOnce安全设置”复选框。

答案 1 :(得分:231)

我的猜测是你没有使用强名命的程序集。当两个项目引用相同程序集的略有不同版本并且更依赖项目引用这些项目时,我遇到了这个错误。我的解决方案是从.csproj文件中的程序集名称中删除密钥和版本信息(无论如何都没关系),然后进行干净的构建。

不同程序集版本之间的更改与引用它们的解决方案部分兼容。如果您不是这种情况,则可能需要做更多工作来解决问题。

的NuGet

如果符合以下条件,NuGet很容易陷入这种情况:

  1. 您将软件包安装到解决方案中的一个项目中。
  2. 该软件包的新版本已部署到软件包源。
  3. 您可以在同一解决方案中将其安装到另一个项目中。
  4. 这会导致解决方案中的两个项目引用该程序包程序集的不同版本。如果其中一个引用另一个并且是ClickOnce应用程序,您将看到此问题。

    要解决此问题,请在Nuget Package Manager控制台发出update-package [package name]命令,以便将所有内容都放到一个公平的竞争环境中,此时问题就会消失。

    您应该在解决方案级别而不是在项目级别管理NuGet包,除非有令人信服的理由不这样做。解决方案级别的包管理避免了多个版本的依赖项的可能性。使用管理用户界面时,如果合并标签显示1个或多个包有多个版本,请考虑将它们合并为一个。

答案 2 :(得分:68)

请参阅此answer

  

转到发布页面,然后单击“应用程序文件”。从那里你应该看到你的DLL的列表。确保那些给您带来麻烦的人将其发布状态标记为“包含”而不是“先决条件”。

答案 3 :(得分:21)

我遇到了这个问题。之所以发生这种情况,是因为我有许多项目指向同一个程序集但来自不同版本我解决了它为我的解决方案中的所有项目选择相同的版本。

答案 4 :(得分:13)

如果您更改了程序集版本或复制了错误中指定的托管库的其他版本,则您可能还会先编译引用错误版本的文件。一个'Rebuild All'(或删除你在前面评论中提到的'bin和'obj'文件夹)应该可以解决这个问题。

答案 5 :(得分:6)

您需要使用密钥对程序集进行签名。进入选项卡签名下的项目属性: enter image description here

答案 6 :(得分:6)

为可能有所帮助的任何人添加我的解决方案。

我有一个ClickOnce解决方案抛出此错误。该应用程序引用了一个常见的“Libs”文件夹,其中包含对Foo.dll的项目引用。虽然解决方案中没有任何项目引用了“Libs”文件夹中Foo.dll的静态副本,但该文件夹中的一些引用确实如此(即:我的解决方案已引用引用Libs\Bar.dll Foo.dll {1}}。)由于CO应用程序从Libs中提取了所有依赖项以及它们的依赖项,因此两个副本都进入了项目。这产生了上述错误。

我通过将Libs\Foo.dll静态版本移动到子文件夹Libs\Fix\Foo.dll来解决问题。此更改使ClickOnce应用程序仅使用DLL的项目版本,并且错误消失。

答案 7 :(得分:6)

删除DLL(发生错误的地方)并重新构建解决方案解决了我的问题。感谢

答案 8 :(得分:6)

如果你在这个问题中尝试了所有其他答案,那么:

  • 您的解决方案中有多个项目
  • 有一个项目(项目A)引用另一个项目(项目B),其项目引用了一个NuGet包。
  • 在项目A中,您使用Intellisense / ReSharper引入项目B中引用的NuGet包的引用(当项目B中的方法返回由NuGet包提供的类型并且该方法在Project中使用时,可能会发生这种情况A)
  • 通过NuGet Package Manager(或CLI)更新了NuGet包。

...您的项目中可能有单独版本的NuGet软件包DLL。引用,作为Intellisense / ReSharper创建的引用将是" normal"引用,而不是预期的NuGet引用,因此NuGet更新过程无法找到或更新它!

要解决此问题,请删除项目A中的引用,然后使用NuGet进行安装,并确保所有项目中的NuGet包都是相同的版本。 (如this answer中所述)

Life Pro提示:

只要ReSharper / Intellisense建议添加对项目的引用,就会出现此问题。它可能比上面的例子更加复杂,有多个交织项目和依赖关系使得难以追踪。如果ReSharper / Intellisense建议的引用实际上来自NuGet包,请使用NuGet进行安装。

答案 9 :(得分:5)

在我更新了WindowsAPICodePack之后发生这种情况时,我刚刚重建了解决方案。

构建 - >重建解决方案

答案 10 :(得分:4)

我的解决方案中有太多项目要经过并单独更新,所以我通过以下方式解决了这个问题:

  • 右键单击我的解决方案并选择“管理解决方案的NuGet包...”
  • 转到“更新”标签
  • 查找受影响的包并选择更新
  • 点击确定,这使包的所有实例都更新

答案 11 :(得分:4)

卸载并重新加载问题项目解决了它。

答案 12 :(得分:3)

您的装配是否正确签名?

要检查此项,请在项目上按Alt + Enter(或右键单击,然后单击属性)。转到“签名”。确认选中了“签署程序集”复选框,并选中了强名称密钥文件,并且“仅限延迟签名”未选中

答案 13 :(得分:3)

在将Excel加载项从packages.config迁移到PackageReference后,我遇到了此问题。似乎与this issue有关。

如果您不使用ClickOnce,以下内容将作为粗略的解决方法(它将忽略.manifest文件中的所有依赖项信息):

  1. 卸载项目,编辑.csproj
  2. 找到如下所示的部分:

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
    
  3. 编辑引用的.targets文件的重命名副本(在我的情况下,该文件解析为C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets,我在同一文件夹中制作了副本Microsoft.VisualStudio.Tools.Office_FIX.targets-没有)请检查它是否可以在其他文件夹中使用。

  4. 找到GenerateApplicationManifest元素并将其属性Dependencies="@(DependenciesForGam)"更改为Dependencies=""

  5. 更改2中找到的部分,以改为引用您编辑过的.targets文件。

每当VS随附的.targets文件的版本被更新(或您将无法获得更新)时,都必须重复执行此操作,但是我希望它将很快得到解决... / p>

答案 14 :(得分:3)

我去了发布,应用程序文件,发现dll抛出错误将其更改为'包括'来自'包含(自动)'。我现在可以发布了。

答案 15 :(得分:3)

当您更改引用的.dll的版本时,会导致此问题。您需要删除目标构建文件夹中的所有项目或.dll。

答案 16 :(得分:3)

现在,这是解决问题的另一种方法:

  • 右键单击项目并选择“卸载项目”选项。您会注意到项目变得不可用。

  • 右键单击不可用的项目,然后选择“编辑”选项。

  • 向下滚动到'&lt; ItemGroup&gt; '包含所有资源标记的标记。

  • 现在转到错误列表中显示的引用,您会注意到它使用单个标记(即< Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >)。

  • 将其更改为如下所示:

<Reference Include="assemble_name_here, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" >
    < Private > True < / Private >
    < HintPath > path_here\assemble_name_here.dll < / HintPath >
< / Reference >
  • 保存更改,再次右键单击不可用项目,然后单击“重新加载项目”选项,然后构建。

答案 17 :(得分:2)

如果您的主项目使用了一些库项目并且引用了它们,那么当您在库项目中更改某些内容时,如果项目引用程序集dll文件而不是库项目,则会导致此问题(例如:重命名类)

您可以在对象浏览器窗口(菜单View-&gt; Object Browser)中查看对主项目的所有引用。对dll文件的引用始终具有版本号。例如:TestLib [1.0.0.0]

解决方案:将主项目的当前引用删除到库项目,并再次添加对该库项目的引用。

答案 18 :(得分:2)

我得到了类似的编译器错误。一旦我将dll文件的依赖项目添加到解决方案,问题就解决了。

答案 19 :(得分:0)

在这里尝试了大部分解决方案之后,我最终只是通过点击一次项目添加了对项目的引用,将其更改为Include中的Include(Auto),它终于有效了。

答案 20 :(得分:0)

我在一个有6个项目的解决方案中有这个。 我的一个项目是将命名程序集称为文件引用。其他人都指向项目参考。

在这些情况下,我通常会遇到不同的错误。

我的解决方案是删除引用它的任何位置的命名程序集并将其添加回来。 一旦我完成了这个项目,问题就消失了。 在此之前,我尝试清理解决方案,并确保没有签署任何项目。

希望它可以帮助某人...

答案 21 :(得分:0)

如果它与依赖项依赖项不匹配,请转到解决方案级别的NuGet包管理器,然后选中Update and Consolidate选项卡,将其全部协调一致。

答案 22 :(得分:0)

我最近遇到了这个问题。就我而言,我在不同的程序集上有NuGet包。我所拥有的是与我自己的组件相关的相同NuGet包的不同版本 我的解决方案是在解决方案上使用NuGet包管理器,而不是单个项目。这使得整合&#34;选项,您可以在任意数量的项目中升级NuGet包 - 因此它们都引用相同版本的程序集。 当我进行整合时,构建失败消失了。

答案 23 :(得分:0)

我也碰到了一些问题,我只需要删除.dll (可以在参考中找到)导致错误并再次添加

像魅力一样工作。

答案 24 :(得分:0)

尝试使用update-package -reinstall -ignoredependencies

答案 25 :(得分:0)

只需转到发布->应用程序文件->并将受影响的dll发布状态从先决条件更改为包括! 这对我有用!