是否有必要在目标计算机上注册已编译的DLL(用C#.NET编写)。
目标机器将安装.NET,是否足以简单地将DLL丢弃到目标机器上?
答案 0 :(得分:31)
我觉得你有点困惑。为了使用它,从来没有需要注册一个DLL。
使用dll只需加载它(给定已知位置或库是否在系统路径中)并获取您想要使用的函数的地址。
在分发需要将某些条目添加到Windows注册表的COM或ActiveX对象时,使用了注册dll。为了使用COM服务(例如),您需要引用GUID(即唯一标识符),它允许您获取实现服务的dll句柄(或提供对它的访问)。有时您可以参考完全限定的名称并获得相同的结果。
为了使所有这些工作,需要注册dll。这个“注册”过程只是在注册表中创建了几个条目,但主要是这两个:一个将GUID与dll的位置相关联(这样你就可以通过GUID引用它而不知道它到底在哪里)和第二个将全名与GUID相关联。但同样,这仅适用于COM或ActiveX对象。
在.NET中开发应用程序时,项目中引用的库会在需要时自动加载,而不必担心找到或加载它们。为此,框架检查引用库的两个位置。
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。