下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

.教你学会在Net中消除Dll中的dependency

作者:课课家     来源: http://www.kokojia.com/点击数:536发布时间: 2015-11-10 00:02:55

标签: ASPASP开发ASP教程

大神带你学编程,欢迎选课

  在众多学习中,文章也许不起眼,但是重要的下面我们就来讲解一下!!计算机编辑语言

      我们在做.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

编程语言(programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。[1]
最早的编程语言是在电脑发明之后产生的,当时是用来控制提花织布机及自动演奏钢琴的动作。在电脑领域已发明了上千不同的编程语言,而且每年仍有新的编程语言诞生。很多编程语言需要用指令方式说明计算的程序,而有些编程语言则属于声明式编程,说明需要的结果,而不说明如何计算。c语言编程入门

  如果你的项目中引用了其它的不带有强名的控件或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中的名字,这里不需要加任何路径。

大家学到了多少?如果意犹未尽,可前往课课家官网直接查看,希望大家获益匪浅哦!!!

赞(106)
踩(4)
分享到:
华为认证网络工程师 HCIE直播课视频教程