技术开发 频道

在非托管事件接受里处理来自于.NET 组件的事件


安装包含.NET 组件的程序集

    在先前看到的例子中,把.NET 组件和同一目录下COM 元数据代理程序集设置为应用程序,而且此应用程序正在使用它,因此,当它探索程序集时,运行库程序集解析器就会为它定位。在引用它的应用程序同一目录下以这样的方式安装的程序集 被称作专用程序集。另外一种定位被引用的程序集的方法就是使用配置文件,告诉程序集解析器到哪里寻找被引用的程序集。当.NET运行库运转并绑定到这样的专用程序集上时,它与译本无关。如果你的程序集总被大量的应用程序使用,在全球储藏室里安装程序集非常有用,因此其它应用程序可以享用并使用此程序集。这个被享用的程序集储藏室被称为全局装配件缓存 (全局程序集缓存 )。被安装在全局装配件缓存的程序集被称为共享名程序集或者是强名称程序集.这是因为这些程序集有一个典型的"共享名" 或者是 "强名称"与它相连接,它们附带一个文本名,版本号码, 公钥标记, 文化信息, 以及数字化签名.因此怎样为程序集生成一个Strong name。你需要做的第一件事情就是使用强名称工具(SN.exe),生成金钥对。你可以从命令行运行SN.exe,创建一个新的任意钥对。

   sn -k MyKeyPair.snk

   如果一切顺利,你应该看到下面的信息。
Key pair written to MyKeyPair.snk
    一旦生成了钥对,你需要将这个钥对与程序集连接起来,要为程序集生成一个共享名。使用   System.Reflection.AssemblyKeyFileAttribute,你可以完成这一过程。AssemblyKeyFile属性把钥对文件(此钥对是从SN.exe生成的)与程序集连接起来,因此公钥 和数字签名(是通过使用私钥和程序集清单里的信息生成的)可以被用于生成程序集的共享名称。在编译过程中,要求钥对文件生成完全有效的共享名标记式.。但是出于安全问题考虑,大部分组织都能将它们的专用键输送到程序集的开发者。正因为这个原因,这里有一个可用的Delay signing选择。

    System.Reflection.AssemblyDelaySignAttribute允许以后用专用键标记程序集。

    让我们创建Temperature.dll .NET程序集,先前把Temperature.dll .NET程序集作为一个强名称程序集使用。为了完成这些必须把AssemblyKeyFile属性增添到你的组件。如果正在使用Visual Studio.NET,这个属性以及项目方案AssemblyInfo.cs文件中其它相类似的全球属性可以利用一个展位符。你能编辑文件,指定MyKeyPair.snk作为包含你的钥对的文件。
[assembly:AssemblyKeyFile("MyKeyPair.snk")]
    你可以使用System.Reflection.AssemblyVersionAttribute为你的程序集指定译本信息。这个属性允许指定程序集的译本。此译本通常遵循major.minor.build.revision模式。在Visual Studio.NET的C# Class Library solution AssemblyInfo.cs中,这个属性通常可以用到一个占位符。你可以在那里编辑这个属性。

[assembly: AssemblyVersion("1.0.0.0")]
    当编辑了AssemblyInfo.cs文件中上面指定的两个属性后,重建Temparature组件。现在,你程序集有一个强名称与它相连接。为了证明这个,使用强名称工具展示下面的命令,列出程序集的公共钥和记号。
sn -Tp Temperature.dll
    一个与此相似的输出被返回:
Public key is 
0024000004800000940000000602000000240000525341310004000001000100ed87f0432cbf37
fc70eec5d0e59d7e47327729cd99e257a2790c690957691f20c01b47d46a72b20b4f37a829f6ad
82e6594221bbd0193b5499ca0a83db7fc9b78bcb07177f02ef9c827688246f6073f34405e9a441
37017cf6ed52c5001272b0b820926f078bbe8705fa9d411a18d692c94be9541bb3fde38b1b1f79
5a06dde8

Public key token is f80b1601a4d8a9dd
0
相关文章