为什么我要“汇编”* .dll“必须是强签名才能被标记为先决条件。

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

我的猜测是你没有使用强命名的程序集。 当两个项目引用相同程序集的稍微不同的版本,而更多的依赖项目引用这些项目时,我遇到了这个错误。 在我的情况下解决scheme是从.csproj文件中的程序集名称中删除密钥和版本信息(无论如何,这并不重要),然后做一个干净的生成。

就我而言,不同汇编版本之间的变化与解决scheme中涉及到的部分是一致的。 如果情况并非如此,则可能需要做更多的工作来解决问题。

的NuGet

有了NuGet,如果出现以下情况,很容易进入这种情况:

  1. 您可以在解决scheme中将软件包安装到一个项目中。
  2. 该软件包的新版本被部署到软件包源。
  3. 您可以使用相同的解决scheme将其安装到其他项目。

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

对我来说,答案是在Nuget包pipe理器控制台上发出update-package [package name]命令,它将所有内容都带到了一个公平的游戏场,此时问题就消失了。

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

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

看到这个答案 。

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

我有这个问题。 这是因为我有很多项目指向相同的程序集,但从不同的版本。 我解决它select相同的版本到我的解决scheme中的所有项目。

转到项目的属性页面。 然后去'发布',然后'应用程序文件'。 错误中提到的dll将被标记为先决条件。 将其更改为“包含”

如果您更改了程序集版本或复制了错误中指定的不同版本的托pipe库,则可能以前编译过引用错误版本的文件。 “重build全部”(或者删除前面评论中提到的'bin'和'obj'文件夹)应该可以解决这个问题。

为这个问题添加我的解决scheme,任何人可能会帮助。

我有一个ClickOnce解决scheme抛出这个错误。 该应用程序引用了一个常见的“Libs”文件夹,并包含了对Foo.dll的项目引用。 虽然解决scheme中的任何项目都没有在“Libs”文件夹中引用Foo.dll的静态副本,但该文件夹中的某些引用确实(即:我的解决scheme引用了引用Foo.dll Libs\Bar.dll Foo.dll 。)由于CO应用程序从库中取出所有的依赖关系以及它们的依赖关系,所以这两个副本都将进入该项目。 这是上面生成的错误。

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

删除DLL(发生错误的位置)并重新构build解决scheme解决了我的问题。 谢谢

您需要用钥匙签署assembly。 进入选项卡签名下的项目属性: 在这里输入图像说明

如果你在这个问题上尝试了所有其他的答案,而你:

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

…你可能在你的项目引用中有独立版本的NuGet包DLL,因为由Intellisense / ReSharper创build的引用将是一个“正常”引用,而不是NuGet引用,所以NuGet更新过程赢得了“find或更新它!

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


生活专业提示:

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

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

  • 右键点击我的解决scheme并select“pipe理NuGet软件包的解决scheme…”
  • 去更新标签
  • find受影响的软件包并select更新
  • 点击确定,这使得包的所有实例都是最新的

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

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

要检查这一点,请在项目上按Alt + Enter(或者右键单击,然后select属性)。 转到“签名”。 validationcheckbox“签署程序集”被选中,强名称密钥文件被选中,“仅延迟标志” 未选中

当我更新了WindowsAPICodePack后,发生了这种情况,我只是重build了解决scheme。

构build – >重build解决scheme

现在,这是一个不同的方法来解决这个问题:

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

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

  • 向下滚动到包含所有资源标签的“<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 > 
  • 保存您的更改,再次右键单击不可用的项目,然后单击“重新加载项目”选项,然后构build。

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

当您更改所引用的.dll的版本时,会导致这种情况。 您需要删除目标生成文件夹中的所有项目或.dll。

如果您的主项目使用一些库项目并引用它们,如果您的项目引用到程序集dll文件,而不是在项目中更改库项目(例如:重命名类)时引发此问题。

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

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

我有一个解决schemeW / 6个项目。 我的一个项目是把指定的程序集作为文件参考。 其他人都指着项目参考。

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

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

希望它可以帮助别人…

在尝试了大部分的解决scheme之后,我最终刚从click一个项目中添加了对项目的引用,这个引用将其从Include改为Include(Auto),最终运行。