欢迎来到天天文库
浏览记录
ID:41032783
大小:41.00 KB
页数:5页
时间:2019-08-14
《Net共享程序集编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、.Net结构里的程序集Assembly是自我描述的安装单元,它在应用程序域(AppDomain)中运行。您必须首先将程序集加载到应用程序域中,然后才能运行该应用程序,并且,同一程序集可以加载到多个应用程序域中,根据这些应用程序域对该程序集代码使用方式的不同产生了程序集的分类:私有程序集和共享程序集。1、私有程序集我们通常用到的就是私有程序集。这种情况下,我们创建本地应用程序项目(或组件),编译后就生成dll或exe类型的私有程序程序集。当我们在其他客户应用程序中使用这类程序集时,只需要添加引用。当这样的程序集被多个应用程序域使用时,每个应用程序域需要复制该程序集,进程中也将存在该程
2、序集的多个副本。2、共享程序集与私有程序集相对的是共享程序集(SharedAssembly),它提供多个应用程序域访问同一个程序集的能力,特别地,内存中只存在该程序集的同一份副本,这种非特定于域的代码共享极大节省了内存资源占用。并且,在大多数情况下,共享程序集安装在全局程序集高速缓冲存储器(GlobalAssemblyCache)中而不存在于应用程序相关目录下,对它的引用不会产生文件复制,自然也不会产生额外的副本。因而,共享程序集不能简单通过XCOPY命令实现部署,而应使用MSI(MicrosoftWindowsInstaller)进行。当组件和主应用程序不由同一个开发商建立,或者
3、一个大应用程序分布在几个小工程中时,常常需要使用共享程序集。创建名称唯一的共享程序集与私有程序集不同,使用共享程序集时要遵循许多规则。特别地,共享程序集必须有一个唯一的名称(称为强名StrongName)。这个名称被要求必须是全局唯一的,并且应该能够保护该名称,其他人不能再使用它创建同名程序集。一般地,我们通过嵌套命名空间层次结构来满足这一要求。结合公司名称、项目类别(类似文件夹分类)等命名项目类等对象,可以在一定程度上避免程序集重名。而配合使用公共/私有密钥机制,则可以彻底保证名称的唯一性。(关于密钥机制请参见专门的文章),下面简要说明强名称工具Sn.exe在这方面的应用:生成公
4、共/私有密钥对文件.Net结构中的强名称工具Sn.exe有助于使用强名称对程序集进行签名,而通过签名具有强名称的程序集,就可以确保名称的全局唯一性。Sn.exe工具提供用于密钥管理、签名生成和签名验证的选项。其重要的一个应用是生成一个新的密钥对并将其写入指定的文件。引用这个密钥对文件的共享程序集将能够保证唯一的名称。下面的命令行语句创建一个新的随机密钥对并将其存储在myKey.snk文件中。sn-kmyKey.snk(Sn.exe还有很多参数,请参见Microsoft技术支持)修改属性为程序集应用强名称下一步,使用程序集属性将强名称信息引入代码中。属性AssemblyKeyFile
5、Attribute指定包含用于生成共享名称的密钥对的文件名称,这个属性位于AssemblyInfo.cs文件中,该文件在使用VisualStudio.NetSDK创建项目时自动生成,用于保存程序集配置等信息。在代码模块中,添加AssemblyKeyFileAttribute属性的同时指定在使用强名称为程序集签名时要用到的密钥对文件的名称及路径。下面的代码示例当前程序集与名为myKey.snk的密钥文件一起使用:[assembly:AssemblyKeyFileAttribute(@"..myKey.snk")](修改mykey.snk文件为正确的路径),这之后,如果使用Idasm
6、工具查看该程序集,其清单中将包含一个公共密钥(私有密钥将不会保存在程序集清单中,这可以确保程序集不被非法修改)。在全局程序集高速缓冲存储器GAC(GlobalAssemblyCache)中安装共享程序集在我们使用Dll类型的私有程序集时,需要添加该程序集引用。而当私有程序集是exe类型时,还需要将它显式复制到当前应用程序的可执行目录(通常是当前工程的BinDebug目录)中。其实,对DLL类型私有程序集的引用实质上也隐式进行了复制。添加应用后,在当前应用程序可执行目录或其子目录下,你就能够找到被引用的程序集文件(其实正是因为这样的特性,私有程序集安装很简单,只需复制改程序集中的
7、所有文件,一个xcopy命令就足够了,这就是0压缩安装)。与此类似,使用共享程序集也需要添加引用。不同的是,引用共享程序集不产生复制,而是在使用共享程序集前将其安装到全局程序集高速缓冲存储器GAC(GlobalAssemblyCache)中。.Net提供的命令行工具gacutil.exe用于支持这一功能。gacutil.exe可以将具有强名称的程序集添至全局程序集缓存。命令格式为:gacutil-I<程序集名称>其中,"程序集名称"是要在全局程序集缓存中安装的程序集的
此文档下载收益归作者所有