在.NET中,是否需要注册DLL?

时间:2008-12-26 22:35:53

标签: c# .net dllregistration

是否有必要在目标计算机上注册已编译的DLL(用C#.NET编写)。

目标机器将安装.NET,是否足以简单地将DLL丢弃到目标机器上?

7 个答案:

答案 0 :(得分:31)

我觉得你有点困惑。为了使用它,从来没有需要注册一个DLL。

使用dll只需加载它(给定已知位置或库是否在系统路径中)并获取您想要使用的函数的地址。

在分发需要将某些条目添加到Windows注册表的COM或ActiveX对象时,使用了注册dll。为了使用COM服务(例如),您需要引用GUID(即唯一标识符),它允许您获取实现服务的dll句柄(或提供对它的访问)。有时您可以参考完全限定的名称并获得相同的结果。

为了使所有这些工作,需要注册dll。这个“注册”过程只是在注册表中创建了几个条目,但主要是这两个:一个将GUID与dll的位置相关联(这样你就可以通过GUID引用它而不知道它到底在哪里)和第二个将全名与GUID相关联。但同样,这仅适用于COM或ActiveX对象。

在.NET中开发应用程序时,项目中引用的库会在需要时自动加载,而不必担心找到或加载它们。为此,框架检查引用库的两个位置。

  • 第一个位置是应用程序路径。
  • 第二个位置是GAC。

GAC(全局程序集缓存)允许您有效地注册要在整个系统中使用的dll,并作为旧注册机制的演变。

所以基本上你只需要将dll放在应用程序的同一个文件夹中。

答案 1 :(得分:5)

您需要将其“删除”到需要它的应用程序才能找到它的目录中。

如果有多个应用程序,或者您想要将文件“删除”到应用程序目录以外的某个位置,则通常需要调整PATH变量,或者在全局程序集缓存(GAC)中注册程序集。

答案 2 :(得分:3)

通常将dll放入目标计算机上应用程序的文件夹中就足够了。

如果dll必须可供其他应用程序使用,那么您可能需要考虑GAC

答案 3 :(得分:3)

如果您希望access the assembly via com+。一个例子是使用非.NET应用程序在.NET程序集中定义的类型,例如VB6 winforms应用程序。

如果您打算从其他.NET应用程序访问程序集,则无需执行任何操作。如果您的程序集具有强大的名称,那么将它放在GAC中可能是个好主意。否则,只需将其放在将引用它的应用程序的目录中。

答案 4 :(得分:3)

Windows平台进入现场时.NET的一大卖点是,默认情况下,.NET程序集DLL不必注册,只需将它们私有地由应用程序使用即可在与EXE文件相同的文件夹中。这是一个很大的进步,因为它使开发人员能够避免DLL / COM地狱的冲突。

共享DLL / COM模块被证明是Windows最大的设计错误之一,因为它导致用户安装的应用程序不稳定。安装一个新的应用程序可能搞砸了一直运行良好的应用程序 - 因为新的应用程序引入了更新版本的共享DLL / COM模块。 (实践证明,开发人员正确管理细粒度版本依赖关系的负担过重。)

使用像Maven这样的构建存储库系统来管理模块的版本是一回事。 Maven的工作非常出色。

但是,在最终用户运行时环境中处理该问题是一个完全不同的问题,这种环境分散在数百万用户中。

.NET GAC绝不是解决这个古老的Windows问题的充分解决方案。

私人使用的DLL程序集继续无限可取。这是一个简单易行的方法,因为磁盘空间现在非常便宜(这些天Fry的价格在100美元左右)。与其他产品共享程序集没有任何好处 - 但是当事情向穷人用户南下时,公司的声誉就会松动。

答案 5 :(得分:2)

实际上不需要在目标机器上注册.NET中的dll。

如果您在应用程序中引用.dll,请单击项目中引用下引用的.dll,查看属性并将Isolated隔离设置为TRUE。

现在,这将自动在您的项目中包含此.dll,您的应用程序将使用项目中包含的.dll副本,而无需在目标系统上注册它。

要在此处查看此外观的工作示例:

http://code.msdn.microsoft.com/SEHE

有问题的.dll需要在构建应用程序的系统上注册才能正常工作。但是,一旦构建了项目,就不需要在部署应用程序或程序的任何系统上注册.dll。

使用此方法的另一个好处是,即使将来另一个.dll在相关目标系统上使用相同名称注册,您的项目仍将继续使用您部署的.dll。这是非常方便的.dll有很多版本,并且你希望保持一些稳定性,比如使用你测试的版本,但所有其他应用程序将使用注册的.dll,除非他们也使用isolated = true方法。

以上示例就是其中一种情况,Skype4COM有很多版本,它们是Skype API .dll,可以经常更改。

此方法允许上面的示例使用项目测试过的API .dll,每次用户安装新版本的Skype时,都可能安装此.dll的修改版本。

此外,有些Skype客户端没有安装此.dll,例如,Skype客户端的商业版本较小,并且不包含此.dll,因此在这种情况下,项目不会失败.dll缺少并且没有被注册,因为它被包含在项目中为isolated = true。

答案 6 :(得分:0)

应用程序可以使用.NET dll,只需将其与应用程序放在同一文件夹中即可。

但是,如果您希望其他第三方应用程序找到DLL并使用它,则还必须将其包含在其分发中。这可能是不可取的。

另一种方法是在GAC(全局程序集缓存)中注册DLL。