Chinaunix首页 | 论坛 | 博客
  • 博客访问: 482206
  • 博文数量: 35
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1234
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-06 22:48
文章分类

全部博文(35)

文章存档

2008年(35)

我的朋友

分类:

2008-12-03 23:02:37

看《CLR VIA C#》时候看到了C#和COM组建相互转换的时候,有些东西不太明白卡住了:<,所以在网上搜了一下相关的资料:


原文地址:http://hi.baidu.com/caojuxiang/blog/item/2cdcd6cc6812751601e928b7.html
GAC全称是Global Assembly Cache
  作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样, 很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有 GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下 面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。
  除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly:
  1)创建一个strong-name的Assembly,例如ToolbarComponent.dll
  2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC
  3)在程序中动态装载:
  System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f");
  MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache);
  在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置 ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil -l"查到。
  另外,上面提到了GAC中的Assembly必须是strong-name的。创建strong-name的Assembly的步骤大致如下:
  a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。
  b) 在VS.NET里面修改“AssemblyInfo.cs”文件:
  [assembly: AssemblyDelaySign(false)]
  [assembly: AssemblyKeyFile("..\\..\\keyPair.snk")]
  c) 编译项目,就能得到一个strong-name的Assembly。
  MSDN中有一些对GAC的介绍,您可以参考:
  1)《Assembly Cache Viewer (Shfusion.dll)》
  2)《Global Assembly Cache》
  3) MSDN(Gacutil.exe资料):(VS.80).aspx
  .NET Framework中附带了一些和GAC有关的工具,其中包括:
  1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly
  2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image
  3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。
   -------------------------------------------------------------------

例外一篇参考文章:
部分节选如下:
四:给程序添加强名(strong name)
  1:创建一对密钥
  用来创建密钥的工具是称为sn.exe的共享工具。通常通过命令提示运行它,该工具可执行各种任务以生成并提取密钥。我们需要用以下方式来运行sn.exe。
    sn –k key.snk
  其中key.snk 代表将保存密钥的文件的名称。它的名称可以是任意的,不过习惯上带有.snk后缀名
  2:签名
  签名通常是在编译时进行的。签名时,用户可利用C#属性通知编译器应该使用正确的密钥文件对DLL进行签名。要做到这一点用户需要打开工程中的AssemblyInfo.cs文件并进行修改。
  [assembly:AssemblyKeyFile(“..\\..\\key.snk”)]

五:编译成DLL (具体步骤)
  菜单:(生成-生成)
  如果一切正常,就会生成DLL文件

六:使用regsvcs.exe将Dll注册到COM+ Services里面
  我们需要用以下方式运行regsvcs.exe
  regsvcs dll文件名
  如果一切正常的话,regsvcs.exe就会把dll输入到COM+ Services中。
  至此,我们已经生成并注册了这个可以由其它程序使用的类,现在,我们来写一个控制台程序来检验这个类是否正常运行


阅读(1144) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~