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

12

在目标机器上部署C# .NET编写的已编译DLL文件,是否需要进行注册?

目标机器已安装.NET,仅仅将DLL文件拷贝至目标机器中是否足够?

7个回答

32

我认为你有点混淆了。注册dll从来不是使用它所必需的。

仅需要加载dll(如果已知位置或库在系统路径中)并获取您想要使用的函数的地址即可使用dll。

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

为了使所有这些工作正常,必须注册dll。此“注册”过程只是在注册表中创建几个条目,但主要包括以下两个:一个将GUID与dll的位置关联起来(以便您可以通过GUID引用它,而不必知道其确切位置),第二个将完整名称与GUID相关联。但再次强调,这仅适用于COM或ActiveX对象。

当您在.NET中开发应用程序时,在项目中引用的库会在需要时自动加载,无需担心定位或加载它们。为了做到这一点,框架会检查两个位置以查找所引用的库:

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

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

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


2
这是不正确的。如果程序集是强名称,它将首先检查GAC。如果没有强名称,则系统将首先检查GAC,然后按照以下过程定位程序集http://msdn.microsoft.com/en-us/library/15hyw9x3.aspx。 - Spence
如果参数没有强名称,系统将不会检查全局程序集缓存(GAC),请原谅打字错误。 - Spence
任何Interop库,正如其名称所示,都是一个.NET包装器,它只是利用系统中已经注册的COM对象。在这种情况下,当您安装Office时,Office COM库会被注册。 - Jorge Córdoba

5
你需要“放置”它到一个目录中,应用程序才能找到它。
如果有多个应用程序,或者你想将文件“放置”到其他位置而不是应用程序目录中,通常需要调整PATH变量或在全局程序集缓存(GAC)中注册程序集。

3

通常情况下,只需将dll文件拖放到目标计算机上您的应用程序所在的文件夹中即可。

如果其他应用程序也需要使用该dll文件,则可以考虑使用全局程序集缓存(GAC)


3

如果您希望通过com+访问程序集。一个例子是从非 .NET 应用程序(如 VB6 Winforms 应用程序)中使用在 .NET 程序集中定义的类型。

如果您计划从另一个 .NET 应用程序访问程序集,则无需采取任何措施。如果您的程序集具有强名称,将其放入 GAC 可能是个好主意。否则,只需将其放入将引用它的应用程序所在的目录中即可。


3
.NET在Windows平台上的一个伟大卖点是,默认情况下,.NET程序集DLL不需要注册,只需将它们放在与EXE文件相同的文件夹中,应用程序就可以私下使用它们。这是一个巨大的进步,因为它使开发人员避免了DLL/COM地狱的困扰。
共享的DLL/COM模块被证明是Windows最大的设计错误之一,因为它导致用户安装的应用程序不稳定。安装新应用程序可能会破坏原本正常工作的应用程序,因为新应用程序引入了共享DLL/COM模块的新版本。(在实践中,对开发人员来说,管理细粒度版本依赖关系太过繁琐。)
使用类似Maven的构建存储库系统管理模块的版本是一回事。Maven在它所做的事情上非常出色。
然而,在跨越数百万用户的终端用户运行时环境中解决这个问题则完全不同。
.NET GAC绝不是解决这个古老的Windows问题的足够方案。
继续私下使用DLL程序集仍然是无限可取的。这是一个无脑的选择,因为现在磁盘空间非常便宜(现在在Fry's只需要100美元就可以购买到1TB的硬盘)。与其他产品共享程序集没有任何好处,但当事情对可怜的用户产生负面影响时,却会损害公司的声誉。

我曾在微软工作了五年,期间参与的每个项目都涉及到DLL/COM/DCOM问题。后来,我参与了.NET项目的开发,在这个项目中,通过私有程序集解决DLL/COM问题是一个明确的期望结果。 - RogerV

2
实际上,在.NET中,无需在目标计算机上注册dll。
如果您在应用程序中引用了一个.dll文件,请单击项目引用下的引用.dll文件,查看属性并将隔离设置为TRUE。
这将自动将此.dll文件包含在您的项目中,并且您的应用程序将使用包含在您的项目中的.dll文件的副本,而无需在目标系统上注册它。
要查看此示例的工作示例,请参见此处:

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

所讨论的.dll文件需要在构建应用程序的系统上注册,以使其正常工作。但是一旦您构建了您的项目,就不需要在部署应用程序或程序的任何系统上注册该.dll文件。
使用这种方法的另一个好处是,即使将来在目标系统上注册了另一个同名的.dll文件,您的项目仍将继续使用您部署的.dll文件。这对于一个.dll有多个版本并且您希望保持一些稳定性的情况非常方便,例如使用您测试过的版本,而所有其他应用程序都将使用已注册的.dll文件,除非它们也使用了隔离=true的方法。
上面的例子就是这种情况之一,Skype4COM有许多版本,它是一个Skype API .dll文件,可能经常发生变化。
这种方法允许上述示例使用项目经过测试的API .dll文件,每当用户安装新版本的Skype时,可能安装了修改过的此.dll文件的版本。
此外,有一些Skype客户端不安装这个.dll文件,例如商业版的Skype客户端较小,不包括这个.dll文件,因此在这种情况下,项目不会因为缺少这个.dll文件而失败或未注册,因为它被作为隔离=true包含在项目中。

0
一个应用程序可以通过将.NET dll与应用程序放在同一文件夹中来使用它。
但是,如果您希望其他第三方应用程序找到并使用该DLL,则他们也必须在其分发中包含它,这可能不是理想的选择。
另一种选择是将DLL注册到GAC(全局程序集缓存)中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接