.Net中消除Dll中的dependency
正好现在做的这个项目就是这种情况,看了一下网上的资料也不多,于是将自己的解决方法share一下,有什么不好的地方,恳请指正。
大家都知道,在.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中:
这样就生成了一个密钥对。如果你的项目中没有引用其它的不带强名的控件或dll的话,只是想把自己的dll写入GAC,那么在你项目的AssemblyInfo.cs中,把AssemblyKeyFile加上,就是你刚才生成的keyfile.snk文件。
这里的路径是指编译后项目输出的相对路径,所以,如果这里写成这样的话(当然你也可以修改),就应该把刚才生成的keyfile.snk拷贝到项目的跟目录下,以确保在编译的时候能找到snk文件。这样,编译后的dll就可以写到GAC中了:
如果你的项目中引用了其它的不带有强名的控件或dll的话,就需要再做下一步。
2、给不带有强名的控件或dll加上强名
这里要用到两个工具,也是.Net自带的,tlbimp和aximp。tlbimp是将COM类型库中的类型定义转换为CLR程序集的等效定义,aximp是将COM类型库中的类型定义转换为windows窗体控件,详细说明请参考MSDN。
假设你要给tom.dll和MSFlxGrd.ocx加上强名:
aximp ./nostrongname_dll/MSFlxGrd.ocx /keyfile:./snk/MSFlxGrd.ocx.snk ./snk/AxMSFlxGrd.ocx.snk
tlbimp还有很多选项可以用,比如/namespace:Namesapce, /reference:FileName, /publickey:FileName等等,这个可以到.Net Command窗口输入tlbimp回车就可以看到很多帮助。不过我们常用比如/namesapce和/reference。/namesapce可以不加,这时用的是默认的比如上例中的Interop_tom。/reference对我们来说一般比较有用,比如上例中的tom.dll有引用了其它的dll,而我们在给tom.dll加了强名之后又不想把它引用的dll都加进来,这时就要用到/reference选项了。比如tom.dll又引用了tom1.dll和tom2.dll,如果我们不加/reference选项,那么在执行完tlbimp之后,在./strongname_dll目录下除了Interop_tom.dll外,还会将tom1.dll和tom2.dll一起加进来。这样就麻烦了,因为我们在使用Interop_tom.dll的时候还要带着它们,可这不是我们需要的。所以我们可以这样做,假设我们已经将tom1.dll和tom2.dll拷贝到/nostrongname_dll目录下了:
这样,在./strongname_dll目录下就不会再有tom1.dll和tom2.dll了。不过tom1.dll和tom2.dll也应该是加了强名的才行。
这里,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中:
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\gacutil -i MSFlexGridLib.dll
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\gacutil -i AxMSFlexGridLib.dll
剩下的工作就是将它们重新引用到你的项目中,重新编译,这样生成的dll在注册时就不需要任何dependency了,因为它们已经在GAC中了,打开c:\winnt\assembly即可看到。
如果要将它们从GAC中删除,则:
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\gacutil -u MSFlexGridLib.dll
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\gacutil -u AxMSFlexGridLib.dll
tom、MSFlexGrid和AxMSFlexGrid为GAC中的名字,这里不需要加任何路径。
转载于:https://www.cnblogs.com/michaelxu/archive/2007/04/17/717396.html
.Net中消除Dll中的dependency相关推荐
- 天马行空W:在C++中调用DLL中的函数
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 在C++中调用DLL中的函数
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 在C++中调用DLL中的函数(2)
本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...
- MFC中制作Dll中带对话框资源的动态库
Data:2019/10/23 这篇文章本来是17年写的,现在对这边文章进行细化.更新的是有一些晚了些 想要在MFC中的dll里面添加对话框资源,首先必须的条件是,当前的dll库类型必须是可扩展的DL ...
- C++中调用DLL中的函数的两种方式
一.DLL源文件: extern "C" __declspec(dllexport) int add(int a, int b) {return a + b; } 二.静态调用: ...
- [转]关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决 转自:http://hi.baidu.com/qinfen ...
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)...
通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数? [已结贴,结贴人:darongtou] 如题,网上搜了N多资料,一直找不 ...
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
转自:http://hi.baidu.com/qinfengxiaoyue/item/ff262ccfb53b4c2ba0b50a89 引自:http://blog.csdn.net/sptoor/a ...
- 调用未知DLL中的导出函数
不知道诸位看官是否有过这样的经历:在不经意之间发现一个DLL文件,它里边有不少有趣的导出函数--但是由于你不知道如何调用这些函数,所以只能大发感慨而又无能为力焉.固然有些知名的DLL可以直接通过搜索引 ...
- GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?
GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数? 通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern " ...
最新文章
- 一篇SSM框架整合友好的文章(二)
- jQuery插件—获取URL参数
- 【bzoj5427】最长上升子序列(贪心+LIS)
- 利用windows优化大师软件卸载一手和清理一招
- input属性disabled和readonly的区别
- 【正则表达式】正则表达式
- 腾讯云区块链产品负责人邵兵:产业区块链刚刚起步,做好基础设施才有可能进入2.0阶段
- 轻松看懂概率论与图论基础数学知识
- 这款开源的中文字体,太惊艳了!
- 台式机双系统安装(windows10+ubuntu18.04)及ROS安装的坑点解决
- editplus破解源码
- Arduino Uno - 控制4位8段共阴极数码管 显示数字
- google,翻译英文网站
- 电脑复制粘贴不了怎么办?
- Jumpserver界面设置及界面功能
- 谈谈数据结构的重要性
- ADXL345测量角度
- 【最新最详细】SQL Server 2019 安装教程{超详细 附网盘下载链接}
- ESP32之 ESP-IDF 教学(十三)—— 分区表
- App地推如何统计数据
热门文章
- 【贪心】【codevs】1098 均分纸牌
- onContextItemSelected 与 onMenuItemSelected 的那些事
- JavaScript将JSON转换为字符串
- CollectionBase的使用
- oracle 之 cursor:创建存储过程批量执行DDL语句
- iOS URL Scheme 劫持-在未越狱的 iPhone 6上盗取支付宝和微信支付的帐号密码
- http://blog.csdn.net/jiazimo/article/details/17265061
- apache启动不了
- 19.高性能MySQL --- 锁的调试
- 3.Linux性能诊断 --- 快速检查单(10个命令) 监控