强签名集会

时间:2009-04-06 13:01:34

标签: vb.net compiler-construction publishing

我有一个用Visual Basic 2008 Express制作的项目。我把它从其他人的C#项目转换而来,但它确实有效。它有几个DLL依赖项。我去发布我的项目,所以我可以将它安装在另一台机器上,对于每个DLL,我收到一个错误:“必须强化签名才能被标记为先决条件。”我已经做了一些研究,但是我找不到很多,而且我发现了什么,我真的不明白。这个错误是什么意思?解决它的最佳方法是什么?另外一件事:我花了很长时间才能正确引用我的所有dll,所以我更倾向于解决方案与移动DLL无关,因为这可能会破坏我的主项目中的功能。

10 个答案:

答案 0 :(得分:49)

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

此错误消息的含义是,当前发布设置将使所有相关程序集在目标计算机上的全局程序集缓存中出现,然后才能进行安装。由于GAC中的所有程序集都必须是强签名的,因此标记为未签名的先决条件的任何程序集都将为您提供此错误。

答案 1 :(得分:6)

解决方法比这更简单:

  1. 转到您的项目。
  2. 右键单击并选择“属性”。
  3. 转到“安全”选项卡。
  4. 取消选中启用ClickOnce安全设置。
  5. 除非您通过ClickOnce部署此应用程序,否则您不需要强化程序集。

答案 2 :(得分:4)

强名称程序集主要是由加密密钥签名的程序集。这对Visual Studio来说相当容易,并且不需要重新排序依赖项。

我正在使用非快速Visual Studio,因此步骤可能略有不同。

  • 右键单击项目并选择属性
  • 单击“签名”选项卡
  • 选中“签署程序集”
  • 在组合框中选择“< New ...>”
  • 完成向导
  • 重建

答案 3 :(得分:3)

检查此链接...它包含使用强名称对程序集进行签名的说明:

MSDN: Signing an Assembly with a Strong Name

答案 4 :(得分:2)

要创建强名称,请转到SDK命令提示符或Visual Studio 200X命令提示符,然后键入以下内容

sn -k sgKey.snk

参考this link for details

然后通过运行以下命令将强名称与程序集关联

al /out:MyAssembly.dll MyOldAssembly.dll /keyfile:sgKey.snk

参考this link for details

答案 5 :(得分:1)

在上述解决方案失败后,这对我有用:

错误地删除对程序集的引用,然后重新添加。

答案 6 :(得分:0)

检查Target Framework是否实际设置为3.5或您要定位的任何框架。有时候如果没有正确设置会出错。

答案 7 :(得分:0)

我发现我的问题出在.csproj文件中

<Reference Include="OtherProjectNothingToDo">
  <HintPath>..\..\..\..\Pedidos\XBAP\Pedidos\Pedidos\bin\Release\Pedidos.exe</HintPath>
</Reference>

然后我用记事本将其删除,现在没问题。

答案 8 :(得分:0)

使用Adam Robinson's解决方案允许我发布,但我发现用户一旦发布就无法安装项目,因为最终用户系统会抱怨无法安装,注意到硬盘空间。由于这似乎不太可能是根本原因,我进一步研究了它。

显然我的问题的基础是我的一个引用也引用了我的项目使用的.dll,但是不同的版本。 ClickOnce没有这个,并拒绝将.dll的第二个版本复制到用户的系统,引用已存在的版本。修复它以便.dll和项目引用另一个.dll的相同版本删除了错误并更正了安装问题。

答案 9 :(得分:0)

我也遇到了这个问题。在我的情况下,blabla.dll在我的解决方案中引用,但blabla.dll也用于我在我的项目中引用的another.dll。

在检查两个blabla.dll的版本时,它们不一样。所以我使用正确的blabla.dll更新了another.dll,然后在我的解决方案中引用了新的another.dll。错误消失了。

简而言之:我使用的是两个版本的blabla.dll

如果不让我知道,我希望这是有道理的。 :)

查看我的博客以获取更详细的说明: Blog article

此致,Jacob Iedema