为什么得到“ Assembly'* .dll”必须经过强签名才能被标记为先决条件。”?


266

我正在尝试使用C#4.0编译excel插件,并在Visual Studio中构建项目时开始出现此问题。重要的是要告诉您我以前从未遇到过此问题。什么会导致这种情况发生?


72
快速尝试,清除项目的binobj文件夹,然后重新构建项目。有时这可行。
詹森·埃文斯

您要签署大会吗?
Felice Pollano 2011年

3
@Jason,清理项目并重建对我有用。我刚刚在程序集上签名,该项目可以构建,但是不会发布。
Kratz,

1
@Kratz-很高兴这个技巧对您有用:)有点像通过重新启动来修复计算机!
詹森·埃文斯

在对这些项目进行版本控制并重建之后,当配置管理器在我的多个项目中重置构建设置(即未将它们设置为在“全部重建”上构建)时,这发生在我身上。
阿兰

Answers:


239

我的猜测是您不使用强命名程序集。当两个项目引用同一个程序集的版本稍有不同,而另一个依赖项引用这些项目时,我遇到了此错误。我的解决方法是从.csproj文件中的程序集名称中删除键和版本信息(无论如何都没有关系),然后执行干净的构建。

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

NuGet

使用NuGet,在以下情况下很容易陷入这种情况:

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

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

要解决此问题,请update-package [package name]在Nuget软件包管理器控制台中发出命令,以使所有内容都达到一个公平的竞争环境,这时问题就消失了。

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


7
这是更多信息:social.msdn.microsoft.com/Forums/en/csharplanguage/thread/…。另外,清除binobj以及(如果在控件中)将程序集版本设置为相同的值(例如,将内部版本号保留为零)也很有帮助。
工具包

3
我在回答的结尾加上了一些内容,以反映我今天在使用NuGet和相同错误时的经验。希望它能在某个时候帮助某人(可能几个月后甚至对我自己也有帮助)。
尼尔·巴恩威尔

2
这个错误会一直为我弹出,并从.csproj文件中删除程序集名称,然后清除程序已为我修复了该错误。谢谢!
ScubaSteve

1
如果上述答案不起作用,并且您认为您已使用Intellisense / ReSharper将NuGet引用添加到您的项目之一,则可能需要查看此答案
David Murdoch 2015年

该解决方案包含4个项目。一个项目B是类库。B的dll在其余的三个中被引用。A中引用了其他两个项目(CD)的可执行文件。因此,我建立了A并遇到了同样的问题。该修复是先重建两个项目的其余部分。然后重建项目A已解决的问题。
Vikram Singh Saini 2015年

268

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

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


2
在VS2012中对我不起作用(在发布过程中会自动重新选中此复选框)。我改用这个答案,因为DLL仅用于构建过程。stackoverflow.com/a/8123074/17713
Matthias Meid 2013年

3
使用ClickOnce时,每次使用发布向导发布应用程序时,都会自动选中此复选框。有关更多信息,请参见msdn.microsoft.com/en-us/library/1sfbfyk0.aspx
大卫·默多克

8
我有MSVS 2015,但在项目属性下看不到“安全性”选项卡
zeta

70

看到这个答案

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


2
exel外接程序项目没有“应用程序文件”按钮。stackoverflow.com/questions/6378801/...
谢尔盖·库彻

@SergeyKucher:我不知道。感谢更新。由于您的问题不准确,这是针对Excel加载项的,因此我认为我的答案在这里仍然有效(我在winforms项目中遇到了相同的错误消息,并以此方式解决了)。
Otiel

我有一个winforms项目,该项目运行良好,直到使用发布向导后才收到OP的错误。更改发布状态可以解决此问题。谢谢
克里斯蒂安2015年

7
就我而言,此问题已解决,将“发布状态”从INCLUDE(自动)更改为仅INCLUDE。无论如何,您的回答都有助于避免显示的值。非常感谢
Julio Nobre

22

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


13

如果您更改了程序集版本或复制了错误中所述的托管库的其他版本,则您以前可能还编译了引用错误版本的文件。“全部重建”(或如前面的注释中所述删除“ bin和'obj”文件夹)应该可以解决这种情况。


1
或只是“清洁解决方案”
切片,2012年

“全部重建”首先执行清除操作,等效于“清除”然后执行“构建”。值得一提的是,有时在手动复制文件或使用不同的时间戳复制文件时,“清理” /“重建”功能无法解决问题,因此需要手动删除“ bin”和“ obj”文件夹。
索格2012年

对于与Excel有关的此问题,删除bin / obj文件夹对我有用,其他方法无效。
威廉·梅拉尼


6

为可能会帮助您的任何人添加针对此问题的解决方案。

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

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



6

如果您尝试了此问题的所有其他答案,则您:

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

...您的项目的引用中可能有NuGet包DLL的单独版本,因为Intellisense / ReSharper创建的引用将是“常规”引用,而不是预期的NuGet引用,因此NuGet更新过程不会找不到或更新它!

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


Life Pro提示:

只要ReSharper / Intellisense建议为您的项目添加引用,就会出现此问题。与上面的示例相比,它可能更令人费解,具有多个交织的项目和依赖项,因此很难进行追踪。如果ReSharper / Intellisense建议的引用实际上来自NuGet软件包,请使用NuGet进行安装。


是的,避免使用Resharper添加参考。Resharper将从调试(或发布,如果您处于发布模式)文件夹中获取参考dll。这将引起很多问题,特别是在大型项目中。
cepriego

5

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

构建->重建解决方案


4

解决方案中的项目太多,无法逐一进行更新,因此我通过以下方式解决了此问题:

  • 右键单击我的解决方案,然后选择“管理NuGet解决方案的软件包...”。
  • 转到更新选项卡
  • 查找受影响的软件包并选择更新
  • 单击“确定”,这将使包的所有实例保持最新状态


4

我去发布应用程序文件,发现抛出错误的dll 从'Include(Auto)' 更改为'Include '。我现在可以发布。


4

将Excel插件从packages.config迁移到PackageReference后,我遇到了此问题。似乎与此问题有关

如果您不使用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文件。

每当.targetsVS附带的文件版本更新(或您将无法获得更新)时,都必须重复执行此操作,但是我希望它将很快得到修复...


2
除此之外,解决该问题的一种稍微温和的方法是从第3点的文件中复制整个<Target Name =“ VisualStudioForApplicationsBuild”>部分(即:仅找到文件,不要复制并重命名) ,转至您自己项目的。** proj文件,并进行与第4点中所述相同的更改。这将覆盖仅针对您的项目的行为,然后不会影响计算机上的任何其他内容。如果将来的VS更新中对原始文件进行了更改,则可能仍需要重复此过程。
亚当

3

程序集是否正确签名?

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


我还没有签署* .dll,但是之前没有问题(我之前没有编译错误)。在已发布项目的引用项目之一中引用的dll,我发现了丑陋的解决方案,直接从已发布项目中引用了dll,您能告诉我为什么它现在可以工作吗?或者我该如何以其他方式解决问题?谢谢
Sergey Kucher

1
@ user520535:好吧,如果您之前没有签署过库,则应该这样做。这不是签名库能够使用该库的唯一方法(签名库不能调用未签名的库),但是在处理插件/添加时使用未签名的库也非常棘手。 -ins。现在,为什么它现在而不是以前开始引起问题?我不知道。
阿森尼·穆尔琴科(Arseni Mourzenko)2011年

@ user520535:如果有帮助,您可以自由接受或认可答案。
阿森尼·穆尔琴科

3

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

  • 右键单击项目,然后选择“卸载项目”选项。您会发现您的项目不可用。

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

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

3

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


2

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


2

如果您的主项目使用某些库项目并已对其进行引用,则当您在库项目中进行某些更改(例如:重命名类)时,如果您的项目引用了程序集dll文件而不是库项目,则可能导致此问题。

您可以通过“对象浏览器”窗口中的视图(菜单视图->对象浏览器)检查对主项目的所有引用。对dll文件的引用始终具有版本号。例如:TestLib [1.0.0.0]

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


1

在这里尝试了大多数解决方案之后,我终于从单击一次项目中添加了对该项目的引用,将其从Include更改为Include(Auto),并且终于可以使用了。


1

帮助我的是我进入了软件包管理器解决方案,并查看了导致问题的已安装软件包。我看到几个项目引用了相同的软件包,但版本不同。我根据自己的需要调整了它们,并成功了。


0

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

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

我的解决方案是删除已引用的命名程序集,然后将其重新添加。一旦完成项目,问题就消失了。在执行此操作之前,我尝试清洁解决方案,并确保未签署任何项目。

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



0

我最近遇到了这个问题。就我而言,我的NuGet包位于不同的程序集中。我所拥有的是与我自己的程序集关联的同一NuGet软件包的不同版本。
我的解决方案是在解决方案上使用NuGet软件包管理器,而不是各个项目。这将启用“合并”选项,您可以在其中跨任意多个项目升级您的NuGet软件包-因此它们都引用同一版本的程序集。当我进行合并时,构建失败消失了。


0

我也遇到了种问题,我要做的就是删除导致错误的.dll(可以在参考资料中找到),然后再次添加

奇迹般有效。



0

只需转到发布->应用程序文件->,然后将影响的dll发布状态从先决条件更改为包含即可!这对我有用!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.