为什么我得到'Assembly '*.dll'必须是强符号,以便被标记为先决条件。'?

我试图使用c# 4.0编译我的excel插件,并在Visual Studio中构建我的项目时开始遇到这个问题。重要的是要告诉你,我以前从来没有遇到过这个问题。什么会导致这种情况发生?

130640 次浏览

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

您的程序集是否正确签名?

要检查这一点,在项目上按Alt+Enter(或右键单击,然后Properties)。点击“签名”。验证复选框“签名程序集”已选中,强名称密钥文件已选中,“仅延迟签名”为无节制的

我猜您没有使用强名称程序集。当两个项目引用相同程序集的略有不同的版本,而一个更依赖的项目引用这些项目时,我就犯过这个错误。在我的案例中,解决方案是从.csproj文件中的程序集名称中删除键和版本信息(无论如何这都无关紧要),然后进行干净的构建。

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

NuGet

使用NuGet很容易陷入这种情况,如果:

  1. 将包安装到解决方案中的一个项目。
  2. 将该包的新版本部署到包源。
  3. 将其安装到同一解决方案中的另一个项目。

这将导致解决方案中的两个项目引用该包程序集的不同版本。如果其中一个引用了另一个并且是ClickOnce应用程序,您将会看到这个问题。

为了解决这个问题,在Nuget包管理器控制台发出update-package [package name]命令,将所有东西都带到一个公平的竞争环境中,此时问题就消失了。

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

我就有这个问题。这是因为我有许多项目指向相同的组装,但从不同的版本。我解决它选择相同版本的所有项目在我的解决方案。

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

请看这个回答

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

当我遇到这个问题时,我通过关闭“启用ClickOnce安全设置”来解决它。

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

如果您更改了程序集版本或复制了错误中声明的托管库的不同版本,则以前编译的文件也可能引用了错误的版本。一个“重建所有”(或删除你的“bin”和“obj”文件夹在前面的评论中提到)应该解决这个问题。

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

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

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

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

您可以在对象浏览器窗口(菜单视图->对象浏览器)中按视图检查对主项目的所有引用。对dll文件的引用总是有一个版本号。示例:TestLib [1.0.0.0]

解决方案:删除主项目对库项目的当前引用,并重新添加对该库项目的引用。

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

在我的解决方案中有太多的项目需要逐一检查和单独更新,所以我通过以下方法解决了这个问题:

  • 右键单击我的解决方案并选择“管理解决方案的NuGet包…”
  • 进入更新选项卡
  • 找到受影响的包并选择Update
  • 单击OK,这将使包的所有实例保持最新

卸载和重新加载项目的问题解决了它为我。

如果你试了这个问题的所有其他答案,你会:

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

...你可以在你的项目的引用中有不同版本的NuGet包DLL,因为Intellisense/ReSharper创建的引用将是一个“normal”。引用,而不是预期的NuGet引用,所以NuGet更新过程不会找到或更新它!

要解决这个问题,请删除项目A中的引用,然后使用NuGet安装它,并确保所有项目中的NuGet包都是相同的版本。(如这个答案)


生活小贴士:

当ReSharper/Intellisense建议添加一个引用到你的项目时,这个问题就会出现。它可能比上面的例子复杂得多,多个交织的项目和依赖关系使其难以跟踪。如果ReSharper/Intellisense建议的引用实际上来自NuGet包,使用NuGet来安装它。

这里有一个不同的方法来解决这个问题:

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

  • 右键单击不可用项目并选择“Edit”选项。

  • 向下滚动到' <ItemGroup > '标签,包含所有资源标签。

  • 现在转到已经显示在错误列表中的引用,你会注意到它使用了单个标记(即< 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 >
  • 保存您的更改,再次右键单击不可用的项目,然后单击“重新加载项目”选项,然后构建。

我有这个解决方案w/ 6个项目。 我的一个项目是将命名程序集引用为文件引用。其他人都指向了项目参考。< / p >

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

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

希望它能帮助到某人…

在尝试了这里的大多数解决方案后,我最终只是从点击一次项目中添加了一个引用,这将它从包括更改为包括(自动),它最终工作了。

当我在更新WindowsAPICodePack后遇到这种情况时,我只是重新构建了解决方案。

构建——>重建方案

这是在更改引用的.dll的版本时引起的。您需要删除目标构建文件夹中的所有项或.dll。

如果依赖项不匹配,请在解决方案级别的NuGet包管理器中检查Update和consolidated选项卡,协调所有这些。

我最近遇到了这个问题。在我的例子中,我在不同的程序集上有NuGet包。我所拥有的是与我自己的程序集相关联的相同NuGet包的不同版本 我的解决方案是在解决方案上使用NuGet包管理器,而不是单独的项目。这启用了一个“整合”选项,在这里您可以在尽可能多的项目中升级您的NuGet包-因此它们都引用相同版本的程序集。 当我进行整合时,构建失败消失了

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

我也遇到了一些问题,我所要做的就是导致错误的删除.dll(可以在参考中找到)和重新添加

效果非常好。

我在从包中迁移Excel插件后遇到了这个问题。配置到PackageReference。似乎与这个问题有关。

如果你不使用ClickOnce(它将忽略.manifest文件中的所有依赖项信息),下面的工作作为一个粗略的解决方案:

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

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
    
  3. Edit a renamed copy of the referenced .targets file (in my case, the file resolved to C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets and I made a copy Microsoft.VisualStudio.Tools.Office_FIX.targets in the same folder - didn't check if it works from a different folder).

  4. Find the GenerateApplicationManifest element and change its attribute Dependencies="@(DependenciesForGam)" to Dependencies="".

  5. Change the section found in 2. to reference your edited .targets file instead.

This will have to be repeated whenever the version of the .targets file shipped with VS is updated (or you won't get the updates), but I'm hoping it will be fixed soon...

帮助我的是,我进入包管理器解决方案,查看导致问题的安装包。我看到有几个项目引用了相同的包,但是版本不同。我根据自己的需要把它们排列起来,这很有效。

尝试update-package -重装-ignoredependencies

只需转到发布->应用程序文件->并将受影响的dll发布状态从先决条件更改为包含! 这对我很管用!< / p >
在我的情况下,我将项目升级到。net 4.7.2,但仍然在旧的visual studio版本(2015)中构建。 当我在VS 2019中构建项目时,构建失败消失了