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

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

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

我觉得你有点困惑。 为了使用它,从未需要注册dll。

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

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

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

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

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

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

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

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

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

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

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

如果您希望通过com +访问程序集 。 一个示例是使用来自非.NET应用程序的.NET程序集中定义的类型,例如VB6 winforms应用程序。

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

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

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

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

但是,在一个遍布数百万用户的最终用户运行时环境中处理该问题是完全不同的事情。

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

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

实际上,不需要在目标机器上注册.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。

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

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

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