图片 2

公共语言运行库中的程序集-04强命名的程序集

1.发布项目是出现这个错误网上找了有两种方式,

具有强命名的程序集

强命名是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强命名是使用相应的私钥,通过程序集文件(包含程序集清单的文件,构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio® .NET 和
Windows SDK
中提供的其他开发工具向一个程序集分配多个强命名。强命名相同的程序集应该是相同的。

通过签发具有强命名的程序集,可以确保名称的全局唯一性。强命名还特别满足以下要求:

1)     
强命名依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的不相同。

2)      强命名保护程序

集的版本沿袭。强命名可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。

3)      强命名提供可靠的完整性检查。通过 .NET
框架安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强命名中或强命名本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。

在引用具有强命名的程序集时,您能从中得到诸如版本控制和命名保护。如果该具有强命名的程序集以后引用了具有简单名称的程序集(不具有强命名),则将失去具有强命名的程序集所带来的好处,并依然会产生 DLL
冲突。因此,具有强命名的程序集只能引用其他具有强命名的程序集。

 

图片 1

如何:对程序集进行签名 (Visual Studio)

程序集签名(也称为强命名签名)赋予应用程序或组件一个唯一标识,其他软件可用该标识来显式标识和引用该应用程序或组件。强命名由程序集的标识和公钥/私钥对组成。这些信息存储在一个密钥文件中;此文件可以是个人信息交换 (PFX) 文件或 Windows
证书存储区中的证书。

说明:为了对程序集进行签名,VS
仅支持存储在本地计算机上的项目系统中的个人信息交换
(.pfx) 文件和强命名密钥 (.snk) 文件。

在某些情况下,您可能只具有对公钥的访问权限。如果是这样,您可以使用“延迟签名”来推迟分配私钥。可以使用“项目设计器”的“签名”页中的选项为程序集签名,下面步骤仅适用于为程序集签名,而不是为应用程序和部署清单签名。

要使用强命名为程序集签名,必须具有公钥/私钥对。这一对加密公钥和加密私钥用于在编译过程中创建强命名程序集。可以使用强命名工具 (Sn.exe) 来创建密钥对,密钥对文件通常具有 .snk 扩展名。

在 VS 2005/2008 中,通过
C#、Visual Basic 和
Visual J# 集成开发环境可以生成密钥对,无需使用强命名工具 (Sn.exe)创建密钥对,即可对程序集进行签名。在IDE“项目设计器”中具有“签名”选项卡进行。

 

使用新密钥文件对程序集进行签名

  1. 在项目节点在“解决方案资源管理器”中处于选中状态下,从“项目”菜单中,单击“属性”(或在“解决方案资源管理器”中右击该项目节点,然后单击“属性”)。
  2. 在“项目设计器”中,单击“签名”选项卡。
  3. 选中“为程序集签名”复选框。
  4. 指定一个新密钥文件。在“选择强命名密钥文件”下拉列表中,选择“<新建…>”。请注意,始终以 .pfx
    格式创建新密钥文件。

将显示“创建强命名密钥”对话框。此对话框指定一个用于为程序集签名的新密钥文件。如果指定密码,则创建个人信息交换 (.pfx) 文件;如果不指定密码,则创建强命名密钥 (.snk) 文件。

若要访问此对话框,请在“解决方案资源管理器”中选择项目节点,然后在“项目”菜单上单击“属性”。当“项目设计器”出现时,单击“签名”选项卡。在“签名”页上,选择“为程序集签名”,然后从“选择强命名密钥文件”下拉列表中选择“<新建…> ”。

  1. 密钥文件名称。指定要创建的密钥文件的名称。
  2. 使用密码保护密钥文件。选中此复选框以指定密钥文件的密码。
  3. 输入密码。输入长度至少为 6
    个字符的密码。密码信息存储在计算机的加密存储数据库中。
  4. 确认密码。重新输入在“输入密码”框中键入的字符以进行确认。
  5. 在“创建强命名密钥”对话框中,为新密钥文件输入名称和密码,然后单击“确定”。

说明:或者,可以通过选择“仅延迟签名”复选框启用延迟签名。

一种是重新安装VS2015的ClickOnce程序

使用现有密钥文件为程序集签名

  1. 在项目节点在“解决方案资源管理器”中处于选中状态下,从“项目”菜单中,单击“属性”(或在“解决方案资源管理器”中右击该项目节点,然后单击“属性”)。
  2. 在“项目设计器”中,单击“签名”选项卡。
  3. 选中“为程序集签名”复选框。
  4. 指定一个现有密钥文件。在“选择强命名密钥文件”下拉列表中,选择“<浏览…>”。
  5. 在“选择文件”对话框中,导航到该密钥文件或在“文件名”框中输入其路径;然后单击“打开”以选择它。需要用强命名工具 (Sn.exe)先创建密钥对。

说明:可通过单击“更改密码”更改密钥文件的密码。或者,通过选择“仅延迟签名”复选框启用延迟签名。

第二种是修改项目文件的签名

创建公钥/私钥对

在命令提示处,键入下列命令:

sn –k <file name>

在此命令中,“文件名”是包含密钥对的输出文件的名称。

下面的示例创建名为 sgKey.snk 的密钥对。

sn -k sgKey.snk

如果您需要延迟对程序集签名并控制整个密钥对(密钥对不太可能在测试方案之外),可使用以下命令生成密钥对,然后从中将公钥提取到一个单独的文件中。首先,创建密钥对:

sn -k keypair.snk

下一步,从密钥对中提取公钥,并将其复制到一个单独的文件中:

sn -p keypair.snk public.snk

创建密钥对之后,必须将文件放在强命名签名工具可以找到的位置。

当使用强命名对程序集进行签名时,程序集链接器 (Al.exe)
查找与当前目录和输出目录相关的密钥文件。

 

右击项目文件的属性,选择签名,然后把红框内去掉,保存即可。

如何:延迟为程序集签名 (Visual Studio)

为程序集签名时,您可能不会始终具有对私钥的访问权限。例如,一个组织可能具有开发人员在日常使用中无法访问的严密保护的密钥对。虽然可能提供公钥,但对私钥的访问权限只限于少数几个人。在这种情况下,可以使用“延迟签名”或“部分签名”来提供公钥,从而将私钥的添加推迟到交付程序集时。

可以在“项目设计器”的“签名”窗格中启用延迟签名,如下所示。

  1. 在项目节点在“解决方案资源管理器”中处于选中状态下,从“项目”菜单中,单击“属性”(或在“解决方案资源管理器”中右击该项目节点,然后单击“属性”)。
  2. 在“项目设计器”中,单击“签名”选项卡。
  3. 选中“为程序集签名”复选框。
  4. 指定密钥文件。
  5. 选中“仅延迟签名”复选框。注意,延迟签名的项目将不会运行,也不能进行调试。但是,在开发过程中将强命名工具 (Sn.exe) 和 -Vr
    选项一起使用,可跳过验证。

图片 2