当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > .Net中消除Dll中的dependency

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

ASP.NET 中的 .Net中消除Dll中的dependency


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 125 ::
收藏到网摘: n/a

  我们在做.Net Class Library项目时常常会遇到这样的问题,我想生成一个dll供其它程序使用,但在我的项目里,又需要引用一些其它的reference,像ActiveX控件或其它dll,而这些控件或dll又没有strong name,不能写入到GAC(Global Assembly Cache)中,因而,在注册使用你的dll时,就必须带上这些引用的控件或dll,才能完成注册。然而,这并不是我们需要的,我们只想提供一个dll给人家用就行了,为什么还要带上一堆的控件或dll呢?别人也不愿意这样。那么,有什么办法解决这个问题呢?
 

  大家都知道,在.Net中,如果你试图将一个dll写入到GAC中,那么除了你的dll项目要使用strong name以外,你的项目中用到的其它的控件或dll都需要有strong name,否则,当你注册你的dll时,会提示缺少dependency。这一点让人很烦,但应该有它的好处,利于版本控制。既然是这样,我们只有将引用到的控件或dll都加上strong name,并写入到GAC中,这样在注册你的dll时,就会到GAC中去找它所用到的控件或dll了。那么,如何做呢?大致分两步:


  1、给需要引用的控件或dll加strong name


  这是必须要做的,否则你无法把他们写到GAC中。.Net的SDK提供一个给程序集生成强名的工具,其实不只是生成,还有管理及签名的验证等,只是根据不同的option来的。详细说明请参考MSDN。下面是通过sn创建一个key pair,存储在keyfile.snk中:


  sn -k keyfile.snk

  这样就生成了一个密钥对。如果你的项目中没有引用其它的不带强名的控件或dll的话,只是想把自己的dll写入GAC,那么在你项目的AssemblyInfo.cs中,把AssemblyKeyFile加上,就是你刚才生成的keyfile.snk文件。


  [assembly: AssemblyKeyFile("..\\..\\keyfile.snk")]


  这里的路径是指编译后项目输出的相对路径,所以,如果这里写成这样的话(当然你也可以修改),就应该把刚才生成的keyfile.snk拷贝到项目的跟目录下,以确保在编译的时候能找到snk文件。这样,编译后的dll就可以写到GAC中了:


  gacutil -i yourdll.dll


  如果你的项目中引用了其它的不带有强名的控件或dll的话,就需要再做下一步。


  2、给不带有强名的控件或dll加上强名


  这里要用到两个工具,也是.Net自带的,tlbimp和aximp。tlbimp是将COM类型库中的类型定义转换为CLR程序集的等效定义,aximp是将COM类型库中的类型定义转换为windows窗体控件,详细说明请参考MSDN。


  假设你要给tom.dll和MSFlxGrd.ocx加上强名:
  

  tlbimp tom.dll keyfile:tom.dll.snk out:tom.dll

  aximp MSFlxGrd.ocx keyfile:MSFlxGrd.ocx.snk AxMSFlxGrd.ocx.snk


  这里,tom.dll.snk、MSFLlxGrd.ocx.snk和AxMsFlxGrd.ocx.snk是根据第一步产生的,每一个dll都要对应一个snk。tom.dll为转换过的dll的名字,没有什么其它含义。另外需要说明的是MSFlxGrd.ocx会产生两个dll,分别是MSFlexGridLib.dll和AxMSFlexGridLib.dll。个人理解为在窗体初始化时会产生一个AxMSFlexGridLib,不知谁有更好的解释?


  这样就把tom.dll和MSFlxGrd.ocx控件加上了强名称并转换为相应的dll了,再把它们写入到GAC中:


gacutil -i tom.dll
gacutil -i MSFlexGridLib.dll
gacutil -i AxMSFlexGridLib.dll


  剩下的工作就是将它们重新引用到你的项目中,重新编译,这样生成的dll在注册时就不需要任何dependency了,因为它们已经在GAC中了,打开c:\winnt\assembly即可看到。


  如果要将它们从GAC中删除,则:


gacutil -u tom
gacutil -u MSFlexGrid
gacutil -u AxMSFlexGrid

  tom、MSFlexGrid和AxMSFlexGrid为GAC中的名字,这里不需要加任何路径。