2.3 强命名 Enterprise Library 程序集
转载请注明出处:http://blog.csdn.net/doriandeng/archive/2007/09/20/1792163.aspx
如果你要构建 Enterprise Library ,你也许要强命名程序集。一个强命名由程序集的标识组成,标识包括它的简单文本名称、版本号和文化信息(如果它支持的话),加上公钥和数字签名。它使用相应的私钥从一个程序集文件(文件包含程序集清单,它依次包含名称和生成程序集的所有文件的哈希)生成。用一个强名称签名一个程序集,以确定名称是全局唯一的。有一样的强名称的程序集应该是一样的。
例如,如果打算在多个程序集之间共享 Enterprise Library 程序集,可以安装它们到全局程序集缓存中。在全局程序集缓存中的每个程序集,必须有一个全局唯一的名称,这可以用一个强名称来确定它。即使仅在单一的应用程序中使用程序集,也可以强命名程序集以保证应用程序使用了正确的程序集版本。
强名称可以满足下列需求:
-
强名称保证名称的唯一依赖于唯一的密钥对。没有人能生成同样的程序集名称,而你可以,因为用一个私钥生成的程序集有不同的名称要好过用另一个私钥生成程序集。
-
强名称保护程序集的版本系。强名称可以确保没有谁可以产生你的程序集的子序列版本。用户可以确认他们加载的程序集版本,与应用程序构建所使用的版本来自同一发布者。
-
强名称提供了强完整检查。通过 .NET Framework 安全性检查可以保证程序集的内容在它构建后没有被修改过。然而,要注意的是强名称的所在和它们自己并不隐含信任级别,例如,数字签名和支持证书所提供的级别。
关于部署程序集到全局程序集缓存中的信息,请参见用程序集和全局程序集缓存工作。
使用强名称向导包
因为大量项目和让单元测试程序集访问应用程序块程序集的内部类型、成员的[InternalsVisibleTo]属性的包含,强命名 Enterprise Library 程序集是困难且耗时的。此 Enterprise Library 发行包含了预编译、强命名的程序集,但如果你打算定制代码的话,你依然想要自己强命名程序集。Enterprise Library 的此发行包含了一个与 Visual Studio 集成的强命名向导包。它自动处理项目的强命名集合,也修改任何 [InternalsVisibleTo] 属性以包含一个公钥。这个向导包对 Enterprise Library 特别有用,但它也可以用于其他 .NET Framework 解决方案。
向导包包含下列功能:
- 创建强名称密钥对文件
-
此方法创建一个公/私钥对。如果你还没有打算用于签名程序集的密钥对文件,可以首先使用此方法。
- 强命名此解决方案或解决方案目录中的所有项目
-
此方法用一个密钥对文件以强命名整个解决方案或解决方案中的一个项目。如果你从解决方案根中选择方法,在解决方案中的所有项目都将被强命名。你也可以用选择特定项目的方法选择你要强命名的项目。
使用强命名向导包
-
打开 Visual Studio;
-
打开包含要强命名的项目的解决方案;
-
在
菜单上,单击 ; -
在Guidance Package Manager 对话框中,单击 ;
-
在Enable and Disable Packages 对话框中,选择要使之可用的包;
-
单击
; -
在 Guidance Package Manager对话框中,单击 。
创建密钥对文件
-
右单击一个项目文件夹;
-
单击
; -
在Create Key Pair for Strong Naming 对话框中,输入密钥对文件名;
-
单击
。
在拥有一个密钥对文件后,就可以强命名在文件中的项目了。
强命名一个项目
-
在一个项目上右单击;
-
单击
; -
在Strong-Name Projects in Solution对话框中,输入密钥对文件的名称或者导航到它并选择它。
-
如果想要向导包自动用公钥更新[InternalsVisibleTo] 属性,选择Update InternalsVisibleTo;
-
单击
。
使用 Visual Studio 强命名 Enterprise Library 程序集
如果不打算使用强命名向导包,可以使用 Visual Studio 强命名 Enterprise Library 程序集。要用强名称来签名程序集,必须要有一个公/私钥对,此公开和私有的加密钥用于在编译时创建强命名程序集。如果多个开发者使用 Enterprise Library ,他们将使用同一强命名程序集,这意味着每个人都使用同一个密钥对来签名程序集。第三个过程描述了如何将一个公钥签名到程序集中。最后一个过程描述如何更新InternalsVisibleTo属性。
创建密钥对
-
在 Visual Studio 命令提示符下,跳转到将要保存密钥对的目录;
-
输入
sn –k keyfile.snk
创建一个密钥对。
注意
也可以在 Visual Studio 2005 中使用CreateStrongName 对话框创建一个密钥对。要访问此对话框,在解决方案浏览器中选择一个项目节点。在 菜单中,单击 。当项目设计器出现时,单击签名标签。在签名页中,选择为程序集签名,然后在选择强名称密钥文件的下拉框中选择新建。
必须从密钥对中提取出公钥(公钥需要用于InternalsVisibleTo 属性)。以下过程说明了如何提取公钥并显示它。
提取并显示公钥
-
在命令提示符下,输入sn –p keyfile.snk publickey.pk 来从密钥对是提取公钥;
-
输入sn –tp publickey.pk 以16进制的格式显示公钥。保持配置控制台窗口打开或者复制到一个文本文件中。
下一过程描述了如何签名一个密钥到 Enterprise Library 程序集中。打开EnterpriseLibrary.VSTS.sln
或EnterpriseLibrary.NUnit.sln
解决方案文件。(这依赖于你安装了哪个 Visual Studio 版本)每个项目都按照这些步骤做,包括单元测试和设计项目。
签名一个公钥到一个项目中
-
在 Visual Studio 中,在解决方案浏览器中选择项目节点。在
菜单上选择 (或者在解决方案浏览器中右单击项目节点,选择 )。 -
在项目设计器中,单击签名标签。
-
选择为程序集签名复选框。
-
在选择强名称密钥文件的下拉框中选择浏览。
-
在选择文件对话框中,导航到创建的密钥文件或者在文件文本框中输入它的路径,单击 来选择它。
-
关闭属性窗口并保存修改。
程序集中的应用程序块单元测试是与应用程序块的程序集分离的。要让单元测试程序集访问应用程序块程序集的内部类型和成员,应用程序块使用了 InternalsVisibleToAttribute 属性。必须更新此属性以包含强命名程序集的公钥。
更新 InternalsVisibleTo 属性
-
在 Visual Studio 中,指向
菜单中的 ,然后单击 -
在整个解决方案中搜索InternalsVisibleTo 属性。
-
对每个InternalsVisibleTo执行下列步骤:
-
复制从密钥对文件中提取出的完全的公钥(不是令牌)。
-
添加公钥到属性中,就像如下示例:
[assembly: InternalsVisibleTo("Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Tests,PublicKey=00240000048000009400000006020000002400005253413100040000010001008B3B735C2738A3A3518083C40A3AF8518DBA6D299F0DB7883A9BE2BFF1343B72A65A04EE8DEACF3A2A5B240126C1E803D14FEEDAC508DE566251756E0EAD6323D1C2B121B24904FEE55086CF1ACBD1146194603421DC0E13D9DC486422180ED756CCDADF31C0B7E4F58FAC82C867F26D8D886A45FF503D7B62BCB24A160C64F8")]
注意
公钥必须输入在一行中,当从命令提示符窗口复制它时,它是在多行中的(就像此示例)。当你更新InternalsVisibleTo 属性时将它放在一行中。
-
保存修改的每个文件。
-
重新构建整个解决方案。