使用InstallShield将组件注册到GAC

问题描述:

我必须使用InstallSheild将多个程序集注册到GAC,并且还需要将程序集复制到INSTALLDIR上。什么是最好的方式来做到这一点?我还需要为程序集调用regasm.exe;我可以使用InstallShield来做到这一点吗?使用InstallShield将组件注册到GAC

对于每个需要在GAC中注册的程序集,我真的需要一个新的“组件”吗?

本答案假定您使用的是Windows Installer项目类型。

1)为每个DLL文件创建一个组件,将其作为密钥文件并将目标文件夹设置为GlobalAssemblyCache。这指示Windows安装程序使用MsiPublishAssemblies标准操作,该操作反过来会调用Fusion以在GAC中注册程序集。这实际上是GACUTIL为您做的。请记住:GACUTIL不是可再发行的。如果程序集具有伴随文件,请将它们作为伴随文件添加到相同的组件。 2)如果您的程序集是ComVisible,则为每个DLL创建一个组件,将其标记为密钥文件并将.NET ComInterop设置为true。这将导致在构建时提取COM信息,并告诉Windows安装程序使用MsiPublishAssemblies标准操作将信息写入注册表。注意:如果您在程序集的注册部分有自定义用户代码,则不会被捕获。这是每个MSDN regasm /regfile不执行此代码路径。您必须手动将此信息输入到该组件的InstallShield注册表视图中。

3)是的,您可以在全局和/或私人部署强名称的程序集。是否可以看到私人组件取决于具有参考组件的组件是否具有UseSpecific组件。

+0

不错的一个慢跑我的记忆克里斯! – 2014-04-03 17:51:40

是的。就系统而言,这是两个不同的文件。 AFAIK,您不能在GAC中拥有文件,并且它同时位于目标计算机上的随机文件夹中。

理论上讲,如果它在GAC中,则不需要它在产品目录中。如果它在GAC中,那将是加载的版本,而不是产品目录中的版本。但是,如果您需要为COM互操作注册它,则会变得更加困难。我可能是错的,但是当我尝试时,我必须同时拥有:一个在目录中,一个在GAC中。

但实际上,如果您在产品目录中需要它,您可能不需要它在GAC中。如果它始终在任何地方从任何程序加载,那么GAC对它来说是一个体面的地方。如果您将其放入GAC for COM互操作中,那就没有必要了;通过将它指向已安装的文件夹来注册它,如果您正确配置了installshield,则可以正常工作。

+0

我在C#中开发了一个Windows工具栏。在这种情况下,dll应该在GAC中,对吗? – Cornel 2010-03-26 16:25:22

+0

不一定。如果您的工具栏的使用者在他们的应用程序中使用它,那么他们只需要在您的应用程序的文件夹中。 – 2010-03-26 17:31:52