日期:2014-05-17  浏览次数:20796 次

[讨论]C#引用DLL什么情况下需要注册,如何注册
以下所有文字内容是我的一点经验,欢迎大家补充修正。

C#中引用DLL非常普遍,第一种情况是在程序代码中使用DllImport导入API。本贴讨论第二种情况:通过添加引用来使用DLL。被引用的DLL必需是基于.net的DLL。比如用于压缩算法的ICSharpCode.SharpZipLib.dll,其提供商分别就不同语言环境提供相应下载。我机器上装的是.net2 ,所以就选用.net2版本的ICSharpCode.SharpZipLib.dll。

有一点非常重要:就是引用的DLL布署到客户机器上后,可能需要注册,否则不能正常工作。比如小弟一个项目,引用了如下DLL:

Microsoft.mshtml.dll
MsHtmHstInterop.dll

MsHtmHstInterop.dll只要放到应用程序根目录下就行了,而Microsoft.mshtml.dll还需要注册才能使用。

我发现:如果一个DLL是由你程序中代码直接使用的,那它不需要注册。比如MsHtmHstInterop.dll,它提供了一些接口和类的定义,供我代码中使用。因此只要把MsHtmHstInterop.dll放到应用程序目录下,就不会出问题。因为我的.exe是它的直接且唯一使用者,我的.exe在运行时首先在同目录下找到MsHtmHstInterop.dll。

Microsoft.mshtml.dll是我程序中的webBrowser使用的。众所周知webBrowser是使用IE内核的。所以,我所引用的Microsoft.mshtml.dll其直接用户其实是IE组件而不是我的.exe。这么一来,如果不注册Microsoft.mshtml.dll,程序就会出问题。

如何注册C# DLL呢?

我的方法是:
编写一个bat文件

gacutil /i dllname.dll 
RegAsm dllname.dll

RegAsm和gacutil在VS里有,把它们和DLL一起打包到客户机器上。

欢迎讨论





------解决方案--------------------
COM组件需要注册,非COM组件但用C,C++,VB等开发的非托管DLL不需要注册,直接PInvoke

------解决方案--------------------
在 .NET 里面,安装程序到 GAC 里面,相当于 ActiveX 时代的注册。
------解决方案--------------------
就我目前用过的来说,
使用C#开发的Dll在.net上不用注册,
用VB6开发的就要注册