向GAC注册/安装程序集的“正确”方法是什么?

时间:2008-10-15 15:32:50

标签: .net windows installer gac

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

回应Lou Franco(和gacutil):

我正在使用Gacutil进行开发,但在我看来并不是安装它的正确方法,因为gacutil不包含在.NET 1.1之前的基本.NET实用程序中 - 它只是一个开发人员工具。 / p>

附加:Gacutil(如下面的回复中所示)不可再发行,因此不应在任何您打算提供给非开发人员的应用程序中使用。 AKA,客户。请参阅This blog post (and comments) by Aaron Stebner

回应使用WIX:

WIX可能很棒而且全部,但它如何在引擎盖下工作? WIX以正确的方式安装组件的方式有哪些细节?怎么看起来呢?它是系统/ .NET调用吗?是否需要在System32中的某个地方隐藏一些需要进行的调用?

(编辑:看起来WIX使用了MSI。在接受的答案中查看我的评论。)

最终编辑:将程序集安装到GAC的正确方法似乎是使用Windows安装程序,而不是其他任何内容。我要试试Wix。谢谢大家!

8 个答案:

答案 0 :(得分:17)

使用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" />
    </Component>
</DirectoryRef>

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

答案 1 :(得分:2)

使用System.EnterpriseServices.Internal.Publish的{​​{1}}方法。

优点:似乎是一个内部工具。可能会做所有正确的事情。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

使用gacutil。

优点:似乎总能奏效。 缺点:

  • 必须使用安装程序打包其他可执行文件。
  • 作为开发实用程序,似乎有其他副作用(如强制安装,无论如何)。
  • 不应包含在提供给客户的任何可再分发中。

答案 4 :(得分:0)

您的安装程序制造商是否有办法将组件安装到GAC中?就你自己而言,我会说GACUTIL:

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

答案 5 :(得分:0)

如果您不想自己处理gacutil,可以随时在visual studio中创建一个安装项目。

但我会坚持使用gacutil。

答案 6 :(得分:-1)

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

gacutil的唯一问题是它不在系统的默认PATH中。但是,对于给定的.Net Framework版本,它位于相对于Windows目录的固定位置。因此,您可以使用以下命令行从任何位置执行它:

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

PS:只是将程序集复制到c:\ windows \ assembly将无法正常工作。资源管理器仅显示文件夹的简化视图,实际上包含许多不同类型的程序集的不同文件夹。从安装程序中复制它不会触发资源管理器在拖放时完成的所有操作。 (这里写的是因为我还没有足够的声誉对其他帖子发表评论)。

答案 7 :(得分:-5)

直接复制到%WINDIR%\ Assembly。

优势:直截了当。

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

极端缺点:正如madmath所说:

只是将程序集复制到c:\ windows \ assembly将不起作用。资源管理器仅显示文件夹的简化视图,实际上包含许多不同类型的程序集的不同文件夹。从安装程序中复制它不会触发资源管理器在拖放时完成的所有操作。 (这里写的是因为我还没有足够的声誉对其他帖子发表评论)。