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

Ser*_*her 262 c# .net-4.0 visual-studio

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

小智 267

当我遇到这个问题时,我通过关闭"启用ClickOnce安全设置"来修复它.

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

  • 我有MSVS 2015,我没有在项目属性下看到安全选项卡 (8认同)
  • 使用ClickOnce时,每次使用"发布"向导发布应用程序时,都会自动选中此复选框.有关更多信息,请参阅https://msdn.microsoft.com/en-us/library/1sfbfyk0.aspx. (3认同)
  • 在VS2012中没有为我工作(复选框在发布期间自动重新检查).我使用了这个答案,因为只有构建过程需要DLL.http://stackoverflow.com/a/8123074/17713 (2认同)

Kit*_*Kit 238

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

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

的NuGet

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

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

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

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

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

  • 以下是一些更多信息:http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/6c24bb92-e488-4a91-b4e7-dc3269904697.此外,清除*bin*和*obj*以及(如果在您的控件中)将程序集版本设置为相同的值(例如,将构建号保留为零)会有所帮助. (7认同)
  • 我已经在你的答案结束时添加了一些内容,以反映我今天使用NuGet的经验以及同样的错误.希望它可以在某个时候帮助某人(甚至可能在几个月后自己!). (3认同)
  • 该错误会一直为我弹出,并从.csproj文件中删除程序集名称,然后清除操作已为我永久修复。谢谢! (2认同)

Oti*_*iel 70

看到这个答案.

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

  • 就我而言,此问题已解决,将发布状态从INCLUDE(自动)更改为INCLUDE.无论如何,你的答案有助于不强调所显示的价值观.非常感谢 (7认同)
  • exel 插件项目没有应用程序文件按钮。http://stackoverflow.com/questions/6378801/i-do-not-have-application-files-dialog-box-in-my-vs2010/6379771#6379771 (2认同)

小智 21

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


Sog*_*ger 13

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


Fel*_*ano 6

你需要用钥匙签署装配.进入选项卡签名下的项目属性: 在此输入图像描述


Nic*_*tch 6

为这个问题添加我的解决方案给任何可能有用的人.

我有一个ClickOnce解决方案抛出此错误.该应用程序引用了一个常见的"Libs"文件夹,并包含对a的项目引用Foo.dll.虽然解决方案中没有任何项目引用了Foo.dll"Libs"文件夹中的静态副本,但该文件夹中的一些引用确实如此(即:我的解决方案Libs\Bar.dll引用了引用的引用Foo.dll.)因为CO应用程序从中删除了所有依赖项Libs以及它们的依赖关系,这两个副本都进入了项目.这产生了上面的错误.

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


Kis*_*ore 6

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


Dav*_*och 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进行安装.


Nat*_*han 5

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

构建 - >重建解决方案


Fun*_*lad 5

在将 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)' != ''" />
    
    Run Code Online (Sandbox Code Playgroud)
  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文件。

每当.targets更新 VS 随附的文件版本时,都必须重复此操作(否则您将无法获得更新),但我希望它很快得到修复...

  • 除此之外,解决问题的一种稍微温和的方法是从位于第 3 点的文件中复制整个 &lt;Target Name="VisualStudioForApplicationsBuild"&gt; 部分(即:只需找到该文件,不要复制并重命名它) ,到您自己项目的 .**proj 文件,并进行与第 4 点中所述相同的更改。这将覆盖您的项目的行为,并且不会影响您计算机上的任何其他内容。如果将来的 VS 更新对原始文件进行了更改,您可能仍需要重复该过程。 (2认同)