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

  正好现在做的这个项目就是这种情况,看了一下网上的资料也不多,于是将自己的解决方法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中:

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中的名字,这里不需要加任何路径

转载于:https://www.cnblogs.com/inspurhaitian/archive/2008/06/26/1230391.html

.net 注册引用的dll相关推荐

  1. C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件

    今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过 ...

  2. asp.net 调用(引用 Native dll 的)C++/CLI dll 的问题及解决

    asp.net 调用引用 native dll 的 C++/CLI dll 会报错:说是dll或其依赖项找不到.具体原因在于 IIS 只会从系统路径下去查找 native dll,不会查找 Bin 目 ...

  3. C# 中将所有引用的DLL 和exe文件打成一个exe文件(转)

    C#工程经常会引用多个DLL文件,形成一个完整的工程项目的目的.这样的工程在发布时,需要将编译形成的EXE文件与DLL文件共同发布.如果感觉麻烦,可以将这些DLL文件与EXE文件合并,最终形成一个更大 ...

  4. WIN 64位注册大漠dm.dll(regsvr32)解决失败方法

    在Windows 32位系统中,Regsvr32.EXE注册DLL运行是的System32文夹内,64位版本的系统比如WIN7 我们要运行Syswow64文 件夹内的Regsvr32.exe,这就是有 ...

  5. 注册修复动态链接库DLL文件

    所有DLL 文件一般都在system32 目录下,如果能把system32 目录下所有DLL 文件都注册一下,那么不就可以解决大多数由DLL 文件引起的问题了吗?怎么才能3秒钟找到DLL文件的&quo ...

  6. oracle引用vs,VS2013中使用oracle,有关引用哪个.dll

    Oracle.Microsoft 和第三方供应商都提供了针对 Oracle 产品进行了优化的数据供应程序. Oracle 和 Microsoft 免费提供其 Oracle 数据供应程序. 访问 Ora ...

  7. 如何在SharePoint 2010项目中引用UserProfiles.dll

    如果需要进行SharePoint的UserProfile开发的话,我们需要引用以下程序集: C:\Program Files\Common Files\Microsoft Shared\Web Ser ...

  8. 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL

    在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...

  9. 重新注册系统所有dll文件

    当开机dll文件报错时没有什么好的解决方案的时候,就重新注册system32下的dll文件就好了. 如何一下把所有的dll文件重新注册一遍呢?其实很简单! (1)开始-运行:输入cmd,按" ...

最新文章

  1. android 当前置顶的控件,Android利用RecyclerView实现全选、置顶和拖拽功能示例
  2. java.net.UnknownHostException: unknown host:xxxx异常解决办法
  3. Redisson官方文档 - 目录
  4. arm opcode hook
  5. SpringBoot集成Spring Security(一)登录注销
  6. 基础知识(五)对齐变换相关函数
  7. mysql tuning primer_mysql检测工具tuning-primer.sh
  8. 使用python简单分析个人微信好友
  9. 面向客户定制化开发项目的管理重点
  10. linux系统盘打快照,使用Btrfs对Linux系统进行快照回滚
  11. Windows XP 优化
  12. linux进程操作日志文件,我使用过的Linux命令之tailf - 跟踪日志文件/更好的tail -f版本...
  13. ASO如何做_ASO优化方案
  14. dedecms index.php挂马,dedecms被挂马常见解决方法
  15. 安卓实时打印kernel日志
  16. appium学习总结5 - 操作设备
  17. aui移动端UI框架
  18. java计算机毕业设计乐多多宠物店网站源代码+数据库+系统+lw文档
  19. 《ElasticSearch技术解析与实战-朱林》
  20. 蒜头君的藏书(STL—map)

热门文章

  1. nginx动态php转发,Nginx 动态 upstreams 实现,nginxupstreams_PHP教程
  2. docker︱docker run的解读与一键部署
  3. R用户的福音︱TensorFlow:TensorFlow的R接口
  4. [tensorflow]win 环境 安装anacoda 4.8.2 和tensorflow 2.1.0
  5. Java 自定义HashSet
  6. 30款油漆纹理Photoshop笔刷
  7. npm-scripts 在 windows 下的兼容问题
  8. Unity3D入门(二):碰撞检測
  9. Loopback、Null0接口揭秘
  10. mybatis直接执行sql_拼多多二面:Mybatis是如何执行一条SQL命令的?