向GAC注册/安装大会的“正确”方式是什么?

在GAC中注册程序集似乎有很多不同的方式,就像在“工作”一样。 但是,做到这一点的“正确”方式是什么?

为了回应Lou Franco(和gacutil):

我正在使用Gacutil进行开发,但是在我看来,这并不是正确的安装方式,因为gacutil不包括在.NET 1.1以前的基本.NET实用程序中 – 它只是一个开发工具。

其他:Gacutil(如下面的回复中所示)不可再发行,因此不应该用于任何您打算提供给非开发人员的应用程序。 AKA,客户。 请参阅由Aaron Stebner撰写的博文(和评论) 。

为了响应使用WIX:

WIX可能是伟大的,但它是如何工作的? 什么细节使得WIX安装程序集的方式正确地安装它? 它是如何查找它? 这是一个系统/ .NET的电话? 是否有一些需要被埋在System32中某个dll中的调用?

(编辑:它看起来像WIX使用微软底部。看到我的意见在接受的答案。)

最终编辑:看起来像GAC安装程序集的正确方法是使用Windows安装程序,没有别的。 我要给威克斯一个尝试。 谢谢大家!

用Wix我会做这样的事情:


 <DirectoryRef Id =“MyDirectory”>
     <Component Id =“MyComponent”Guid =“PUT-GUID-HERE”DiskId =“1”>
         <File Id =“MyAssembly”Name =“MyAssembly.dll”Assembly =“.net”KeyPath =“yes”Source =“MyAssembly.dll”/>
     </成分>
 </ DirectoryRef>

当您在WiX中使用属性Assembly =“。net”作为文件时,它将在此组件的MsiAssembly和MsiAssemblyName表中创建条目,并将其标记为GAC组件。

http://blogs.msdn.com/astebner/archive/2006/11/04/why-to-not-use-gacutil-exe-in-an-application-setup.aspx

它看起来应该避免gacutil; 这不是一个可再发行的应用程序。 相反,安装它们的“正确”方式似乎是使用MSI,一种方法是WIX,由CheGueVerra或其他脚本发布。

使用System.EnterpriseServices.Internal.PublishGacInstall方法。

优点:似乎是一个内部工具。 大概做所有正确的东西。

缺点:作为安装程序的一部分,您仍然需要制作并运行一个调用此应用程序的应用程序(除非您制作的安装程序是自定义应用程序,无论如何)。

您的安装程序制造商是否有将程序集安装到GAC的方法? 就我个人而言,我会说GACUTIL:

http://msdn.microsoft.com/en-us/library/ex0ss12c(VS.80).aspx

如果你不想自己处理gacutil的东西,你总是可以在visual studio中创建一个安装项目。

但我会坚持gacutil我自己。

使用gacutil。

优点:似乎总是工作。 缺点:

  • 必须用您的安装程序打包一个额外的可执行文件
  • 作为一个开发实用程序,似乎有其他副作用(如强制安装,无论如何)。
  • 不应该包含在给予客户的任何可再发行组件中。

最好的方法是使用gacutil -i Library.dll

gacutil的唯一问题是它不在系统的默认路径中。 但是,在一个固定的位置相对于Windows目录,一个给定的.Net Framework版本。 所以你可以使用下面的命令行从任何地方执行它:

 %SystemRoot%\Microsoft.Net\Framework\v1.1.4322\gacutil -i 

PS:只是将你的程序集复制到c:\ windows \ assembly中将不起作用。 资源管理器只显示文件夹的简化视图,其中实际上包含不同类型的程序集的许多不同的文件夹。 在安装程序中进行拷贝不会触发所有由资源管理器执行的操作。 (写在这里,因为我没有足够的声誉尚未评论其他职位)。

直接复制到%WINDIR%\ Assembly。

优点:直截了当。

缺点:AFAIK,%WINDIR%\ Assembly 恰好是现在的位置,它的位置可能会发生变化。 这将使它在未来版本的Windows中打破,或者如果该文件夹的行为chaneges。 这可能不是正确的方法。

极端的缺点:如疯狂所说:

只是将你的程序集复制到c:\ windows \ assembly中将不起作用。 资源管理器只显示文件夹的简化视图,其中实际上包含不同类型的程序集的许多不同的文件夹。 在安装程序中进行拷贝不会触发所有由资源管理器执行的操作。 (写在这里,因为我没有足够的声誉尚未评论其他职位)。