是否有必要在目标机器上注册已编译的 DLL(用 C# .NET 编写)。
目标机器将安装 .NET,只需将 DLL 放到目标机器上就足够了吗?
我觉得你有点混淆了。为了使用它,从来不需要注册一个 dll。
使用 dll 只需要加载它(给定一个已知位置或者如果库位于系统路径中)并获取您想要使用的函数的地址。
在分发需要将某些条目添加到 Windows 注册表的 COM 或 ActiveX 对象时使用注册 dll。为了使用 COM 服务(例如),您需要引用 GUID(即唯一标识符),它允许您获取实现该服务(或提供对它的访问)的 dll 的句柄。有时您可以引用完全限定的名称并获得相同的结果。
为了使所有这些工作,需要注册 dll。这个“注册”过程只是在注册表中创建了几个条目,但主要是这两个:一个将 GUID 与 dll 的位置相关联(这样您就可以通过 GUID 引用它而不知道它的确切位置)和第二个将全名与 GUID 相关联。但同样,这仅适用于 COM 或 ActiveX 对象。
当您在 .NET 中开发应用程序时,项目中引用的库会在需要时自动加载,您无需担心查找或加载它们。为此,框架会检查引用库的两个位置。
GAC(全局程序集缓存)允许您有效地注册要在整个系统中使用的 dll,并作为旧注册机制的演变。
所以基本上你只需要把dll放在应用程序的同一个文件夹中。
您需要将它“拖放”到需要它的应用程序可以找到它的目录中。
如果有多个应用程序,或者您想将文件“拖放”到应用程序目录以外的某个位置,则通常需要调整 PATH 变量,或者在全局程序集缓存 (GAC) 中注册程序集。
通常将 dll 放入目标计算机上的应用程序文件夹中就足够了。
如果 dll 必须对其他应用程序可用,那么您可能需要考虑GAC。
如果您希望通过 com+ 访问程序集。例如,使用非 .NET 应用程序(例如 VB6 winforms 应用程序)的 .NET 程序集中定义的类型。
如果您计划从另一个 .NET 应用程序访问程序集,则无需执行任何操作。如果您的程序集有一个强名称,那么将它放到 GAC 中可能是个好主意。否则,只需将其放在将要引用它的应用程序的目录中。
.NET 在 Windows 平台上的一大卖点是,默认情况下,.NET 程序集 DLL 不必注册,只需将它们放在同一个应用程序中即可由应用程序私下使用文件夹作为 EXE 文件。这是一个巨大的进步,因为它使开发人员能够避免 DLL/COM 地狱的冲突。
共享 DLL/COM 模块被证明是 Windows 最大的设计错误之一,因为它会导致用户安装的应用程序不稳定。安装一个新应用程序很可能会破坏一个运行良好的应用程序 - 因为新应用程序引入了更新版本的共享 DLL/COM 模块。(实践证明,对于开发人员来说,正确管理细粒度的版本依赖关系是一个太大的负担。)
使用 Maven 等构建存储库系统管理模块版本是一回事。Maven 工作得非常好。
但是,在分布于数百万用户的最终用户运行时环境中处理该问题是完全不同的事情。
.NET GAC 绝不是解决这个古老的 Windows 问题的充分解决方案。
私人使用的 DLL 程序集仍然是无限可取的。这是一种不费吹灰之力的方式,因为这些天磁盘空间非常便宜(这些天在 Fry 的 TB 驱动器上大约 100 美元可以)。与其他产品共享程序集并没有什么好处——但当穷人的用户遇到问题时,公司的声誉就会下降。
实际上,不需要在目标机器上的 .NET 中注册 dll。
如果您在应用程序中引用 .dll,请单击项目中引用下的引用 .dll,查看属性并将“隔离”设置为 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上失败丢失并且没有被注册,因为它被包含在项目中作为隔离 = true。
应用程序可以使用 .NET dll,只需将其与应用程序放在同一文件夹中即可。
但是,如果您希望其他第三方应用程序找到该 DLL 并使用它,他们还必须将其包含在其分发中。这可能是不可取的。
另一种方法是在 GAC(全局程序集缓存)中注册 DLL。