2008-12-26 142 views

回答

31

我认为你有点让人困惑。注册一个DLL从未被需要为了使用它。

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

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

为了所有这些工作需要注册的DLL。这个“注册”过程只是在注册表中创建了几个条目,但主要是这两个条目:一个将GUID与dll的位置相关联(以便您可以通过GUID引用它,而不知道它确切位于何处),另一个将全名与GUID关联起来。但是,这只是针对COM或ActiveX对象。

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

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

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

所以基本上你只需要把DLL中的应用程序相同的文件夹。

+1

这是不正确的。如果该程序集名称很强,它将首先检查GAC。如果名称不是很强,那么系统将首先检查GAC,然后按照以下过程找到程序集http://msdn.microsoft.com/en-us/library/15hyw9x3.aspx – Spence 2009-10-15 05:18:52

+0

arg,如果它名称不强,系统不会检查GAC,不要打字错误。 – Spence 2009-10-15 05:19:46

3

它通常足以将dll拖放到目标机器上的应用程序文件夹中。

如果该DLL必须可用于其他应用程序,那么你可能要考虑GAC

5

您需要将其“拖放”到需要它的应用程序所在的目录中。

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

0

应用程序可以使用.NET DLL,只需将它与应用程序在同一个文件夹中。

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

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

3

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

如果您计划从另一个.NET应用程序访问程序集,则不必执行任何操作。如果您的程序集名称很强大,那么将其放入GAC可能是个好主意。否则,只需将其放在将引用它的应用程序的目录中即可。

3

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

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

使用Maven等构建存储库系统管理模块版本是一回事。 Maven非常擅长处理它的功能。

然而,在终端用户运行环境中分布在数百万用户群中的这个问题完全是另一回事。

的.NET GAC绝不足够解决这个古老的Windows问题。

私下消费DLL组件继续无限优选的。这是一个不容小觑的方式,因为现在磁盘空间非常便宜(这些日子大约100美元可以在Fry的驱动器上运行一个TB)。与其他产品共用装配没有什么可以获得的 - 但是当糟糕的用户遇到问题时,公司声誉就会松动。

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缺失并且未被注册为isolation = true。

相关问题