深圳市seo网站设计长沙微网站
web/
2025/10/3 0:43:16/
文章来源:
深圳市seo网站设计,长沙微网站,检察门户网站建设自查报告,东莞做网站公司哪家好http://www.cnblogs.com/smallstone/archive/2010/06/29/1767508.html 一、GAC的作用 全称是Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly#xff0c;例如System.Data、System.Windows.Forms等等。这样#xff0c;很多程序就可以从GAC里面取得… http://www.cnblogs.com/smallstone/archive/2010/06/29/1767508.html 一、GAC的作用 全称是Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly例如System.Data、System.Windows.Forms等等。这样很多程序就可以从GAC里面取得Assembly而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言如果没有GAC那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\vX下面拷贝一份System.Windows.Forms.dll这样显然不如都从GAC里面取用方便也有利于Assembly的升级和版本控制。 二、强命名程序集 因为不同的公司可能会开发出有相同名字的程序集来如果这些程序集都被复制到同一 个相同的目录下最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “DLL Hell”出现的原因。 很明显简单的用文件名来区分程序集是不够的CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名程序集。 一个强命名程序集包含四个唯一标志程序集的特性文件名没有扩展名版本号语言文化信息如果有的话公有秘钥。 这些信息存储在程序集的清单manifest中。清单包含了程序集的元数据并嵌入在程序集的某个文件中。 下面的字符串标识了四个不同的程序集文件 “MyType, Version1.0.1.0, Cultureneutral, PublicKeyTokenbf5779af662fc055” “MyType, Version1.0.1.0, Cultureen-us, PublicKeyTokenbf5779af662fc055” “MyType, Version1.0.2.0, Cultureneturl, PublicKeyTokenbf5779af662fc055” “MyType, Version1.0.2.0, Cultureneutral, PublicKeyTokendbe4120289f9fd8a” 如果一个公司想唯一的标识它的程序集那么它必须首先获取一个公钥/私钥对然后将共有秘钥和程序集相关联。不存在两个两个公司有同样的公钥/私钥对的情况正是这种区分使得我们可以创建有着相同名称版本和语言文化信息的程序集而不引起任何冲突。 与强命名程序集对应的就是所谓的弱命名程序集。其实就是普通的没有被强命名的程序集。两种程序集在结构上是相同的。都使用相同的PE文件格式PE表头CLR表头元数据以及清单manifest。二者之间真正的区别在于强命名程序集有一个发布者的公钥/私钥对签名其中的公钥/私钥对唯一的标识了程序集的发布者。利用公钥/私钥对我们可以对程序集进行唯一性识别、实施安全策略和版本控制策略这种唯一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时CLR能够实施某些“已确知安全”的策略比如只信任某个公司的程序集。 三、如何创建强命名程序集, 如何查看强命名程序集的PublicKeyToken 如何创建强命名程序集 1. 在Visual Studio中的class library工程上点右键, 选择properties. 2. 选择左边的Signing选项卡. 3. 勾选Sign the assembly复选框. 在下拉列表中选择New.... 4. 在弹出的对话框中给snk文件起一个名字. 按OK. 5. 程序集强命名完成. 如何查看强命名程序集的public key token 有时候你需要在web.config文件中或者其他地方引用自己写的强命名程序集, 你需要写入像下面这样的fully qualified name: MyNamespace.MyAssembly, version1.0.3300.0, Cultureneutral, PublicKeyTokenb77a5c561934e089 前面三个部分比较容易获得, 因为是你自己写的, 你当然知道assembly的名字, 版本, 还有culture信息. 比较麻烦的部分是如何获得自己签名的程序集的public key token. 一种平常的方法是使用Reflector来打开自己的程序集, 然后获得token(实际上, Reflector会给你如同上面例子那样的完整信息). 但是这有的时候还是显得有点未免杀鸡用牛刀了. 如果你已经打开了Visual Studio, 那么仅仅是在VS的菜单里点一个菜单项就能获得答案不是更好么? 下面就是步骤. 1. 在Visual Studio中, 打开Tools菜单, 然后点击External Tools这个菜单项. 2. 在弹出的External Tools对话框中, 点击Add按钮. 3. 按照下图进行配置. sn.exe这个工具在不同版本的VS下处于不同的文件夹中. 最简单的找到它的方式是在VS Command Prompt中输入where sn.exe. 在参数框里写入-T $(TargetPath). 然后勾选Use Output Window. 这样的话, 结果就会在VS的output window. 然后点击OK, 4. 结果如图. 5. 在输出窗口可以看到结果. 这在你的solution里有多个project的时候也是可以正常工作的. 只需要点击一下Solution Explorer中的Project, 然后点击我们的菜单项就可以了. 四、如何将自己的dll注册到GAC中 在开发和测试中最常用的工具就是GACUtil.exe。 在GAC中注册程序集跟COM注册差不多但相对更容易 1把程序集添加到GAC中 GACUtil /i sample.dll 参数/i是安装的意思 2把程序集移出GAC GACUtil /u sample.dll 参数/u就移除的意思注意不能将一个弱命名程序集安装到GAC中。如果你试图把弱命名程序集加入到GAC中会收到错误信息” Failure adding assembly to the cache: Attempt to install an assembly without a strong name” d)强命名程序集的私有部署 例子 C:\Program Files\Microsoft Visual Studio 8\VCgacutil -i F:\myweb\BalloonShop\ClassLibrary1\bin\Debug\ClassLibrary1.dll 在C:\WINDOWS\assembly将会看到ClassLibrary1注册成功 五、查看GAC文件内容以及将DLL复制出来 在项目中我们常常会引入第三方的dll一般情况下我们都可以将所需的dll文件复制到硬盘上的一个地方然后在项目中添加引用这个操作很简单但有时候我们会遇到这样的情况就是所要引用的dll在目标机器的GAC里这时我们就不能手动将它拷贝出来了。 其实Windows的GAC是有对应的目录的一般来说为c:\Windows\assembly\这个目录有一些特殊它里面存放的是本机已安装和注册的类库dll并且不允许用户直接对其中的元素进行相关操作如复制、剪切、粘贴、修改名称等不过你可以直接将另一位置的dll文件直接拖放到这个目录下进行dll的安装但是我们不能直接将已经安装进去的dll再拷贝出来。这里我将介绍一种方法来完成这个操作。 首先我们切换到Windows的命令行方式即开始-运行-cmd-回车然后转到GAC所在的目录利用dir命令查看一下其中的内容如下图。 似乎可以明白GAC中的目录结构了基本上我们可以根据GAC目录中的Processor Architecture列来区分dir的类型例如我们要找的System.Web.Extensions属于MSIL在CMD方式下它应该就对应GAC_MSIL然后切换到这个目录下并dir。 看到我们要找的System.Web.Extensions程序集了它也是一个dir继续切进去并dir。 这时只有一个目录了继续切进去然后dir就可以看到我们最终想要的dll文件了然后通过copy命令将它复制出来就OK了 小技巧在CMD方式下使用命令时如果要输入的文件名或目录名太长可以先敲部分字符然后通过Tab键自动补全Windows的command工具会自动为你找到相匹配的内容 六、例子 如上图所示新建了2个类库文件ClassLibrary1、ClassLibrary2 1、使用上面的第三点创建了强类型程序集ClassLibrary1并且注册到GAC中(可以使用上面第三点的方法也可以使用反编译器进行反编译可以查看到PublicKeyToken值。ClassLibrary2为null,ClassLibrary1为568e03e6162a7a2e)。 2、在DataAccess中引用ClassLibrary1、ClassLibrary2编译DataAccess。 3、进入DataAccess工程的bin\debug文件夹下只有ClassLibrary2.dll与DataAccess.dll没有ClassLibrary1.dll 由此可知程序是从GAC中直接取得ClassLibrary1.dll的而不是从ClassLibrary1工程中将ClassLibrary1.dll拷贝到自身的debug中进行引用。转载于:https://www.cnblogs.com/zuiyirenjian/archive/2012/06/09/2543553.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85916.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!