具有强命名的程序集

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

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

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

2)      强命名保护程序

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

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

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

如何:对程序集进行签名 (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. 在“创建强命名密钥”对话框中,为新密钥文件输入名称和密码,然后单击“确定”。

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

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

  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 选项一起使用,可跳过验证。

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

  1. 公共语言运行库(CLR)和中间语言(IL)(一)

    公共语言运行库(.net运行库)即CLR 1.C#先编译为IL,IL为ms的中间语言,IL是平台无关性的. 2.CLR再将IL编译为平台专用语言. 3.CLR在编译IL时为即时编译(JIT) VB.V ...

  2. 预告:公共语言运行库(CLR)开发系列课程(4):COM Interop进阶

    这次我主要讲RCW的原理,生命周期,引用计数,套间,System.__ComObject,事件调用原理等内容.CCW由于时间限制就不涉及了,毕竟大家还是以使用RCW为主. 感兴趣的朋友可以在下面注册: ...

  3. 所引用的程序集没有强命名解决方法

    所引用的程序集没有强命名 1.打开SDK 命令提示窗口; 也就是VS2012 开发人员命令提示,一般所在目录C:\ProgramData\Microsoft \Windows\Start Menu\P ...

  4. 适当地使用公共语言运行库的垃圾回收器和自动内存管理

    小心不要给每个请求分配过多内存,因为这样垃圾回收器将必须更频繁地进行更多的工作.另外,不要让不必要的指针指向对象,因为它们将使对象保持活动状态,并且应尽量避免含 Finalize 方法的对象,因为它们 ...

  5. 强命名保护DLL文件

    强命名保护DLL文件 Posted on 2009-03-19 14:32 花猫.NET 阅读(1390) 评论(2) 编辑 收藏  大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层.业务 ...

  6. CLR via C# 边读边想 03 - 本地程序集和强命名程序集

    Two Kinds of Assemblies, Two Kinds of Deployment CLR 支持两种类型的程序集:weakly named assemblies and strongly ...

  7. 程序员的自我修养--链接、装载与库笔记:运行库

    1. 入口函数和程序初始化 程序从main开始吗?:操作系统装载程序之后,首先运行的代码并不是main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所需要的环境,并且负责调用main函 ...

  8. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  9. visual studio能统计代码规模吗_Windows电脑游戏运行库有必要装吗?

    电脑粉温馨提示:最近公众号推送改版,为了不让你错过电脑粉每天的精彩推送,记得为我们设置星标哦~ Windows 电脑游戏运行库有必要装吗?当您问题的这个问题的时候你就应该想到我们生活在世界上要不要吃饭 ...

最新文章

  1. 链表中倒数第k个节点 1
  2. python处理大量excel数据-使用python将大量数据导出到Excel中的小技巧分享
  3. linux resouce,platform_device和platform_driver驱动的关系
  4. jquery ajax 序列化表单传参提交实体对象到后台action
  5. Flex学习笔记2010-08-16
  6. 如何把定义的数组传回主函数_java数组如何定义
  7. spring学习(49):javaconfig里面定义bean的作用域
  8. HashMap、ConcurretnHashMap面试题详解,源码分析
  9. gephi生成网络关系图_用 NetworkX + Gephi + Nebula Graph 分析lt;权力的游戏gt;人物关系(上)
  10. 【更新】Chromium引擎集成控件DotNetBrowser V1.13发布 | 全新协议处理程序
  11. Labview各版本及开发工具模块下载
  12. jtag接口定义 jtag接口的主要作用是什么
  13. Day01-python编程基础
  14. 七周数据分析01_数据分析思维
  15. 国内和国外DNS服务器地址 全国各地电信DNS服务器地址
  16. 数字内容安全实验一:使用Matlab编程实现 RSA 加密算法
  17. 信源剩余度的计算java_冗余度计算公式
  18. 调制与变频、基带信号与射频信号中的IQ调制(又称矢量调制)
  19. 数组的push()、pop()、shift()和unshift()方法
  20. 几种概率分布(伯努利分布、二项分布、泊松分布、均匀分布、正态分布、指数分布、伽马分布)

热门文章

  1. 影视小程序附带搭建教材
  2. 谷歌地图添加点击事件 Google Maps API V3: Add click event listener to all (multiple) marker
  3. Google AJAX 搜索 API
  4. lua——赢三张牌型处理相关算法(下)——牌型比较
  5. 视觉SLAM中使用Matlab标定摄像头
  6. mysql 存储引擎和数据导入导出
  7. 在Windows10上运行TensorFlow Android Demo实例
  8. MySQL—Linux查看客户端连接信息(连接数、进程等)及SpringBoot配置数据库模板
  9. Java—Remove Deplicates from Sorted Array(顺序数组中去重位置)
  10. 大连印象_2010暑期实训有感【一】