.Net中消除Dll中的dependency

来源:互联网 发布:淘宝原图恢复 编辑:程序博客网 时间:2024/06/03 20:16
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
.Cce640{display:none;}

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

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


1、给需要引用的控件或Dll加strongname


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


sn-kkeyfile.snk

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


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


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


gacutil-iyourDll.Dll


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


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


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


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

tlbimptom.Dllkeyfile:tom.Dll.snkout:tom.Dll

aximpMSFlxGrd.ocxkeyfile:MSFlxGrd.ocx.snkAxMSFlxGrd.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-itom.Dll
gacutil-iMSFlexGridLib.Dll
gacutil-iAxMSFlexGridLib.Dll


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


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


gacutil-utom
gacutil-uMSFlexGrid
gacutil-uAxMSFlexGrid

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

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击