【问题标题】:Methods to programmatically install a .NET assembly into the GAC以编程方式将 .NET 程序集安装到 GAC 中的方法
【发布时间】:2009-09-22 15:30:45
【问题描述】:

我需要创建一个小应用程序或脚本来将 .NET 程序集安装到 GAC 中。我读过有几种方法可以做到这一点,包括:

  • 使用gacutil.exe
  • 执行以下代码行:

    new System.EnterpriseServices.Internal.Publish().GACInstall("Foo.dll");

但是,如果我只是在机器上创建了适当的目录并将程序集复制到该目录中会发生什么? GAC目录结构如下:C:\Windows\assembly\GAC_MSIL\Foo\<version#>__<public token>\Foo.dll

除了创建文件夹结构并将程序集放入其中之外,上述两种方法还有什么特别的作用吗?

【问题讨论】:

  • 在您进行实验之前,请进行备份。
  • 最近重温这个任务,我放弃了 MSI 文件的应用程序/脚本想法。又好又干净!
  • 使用GacInstall("Foo.dll") 代替GACInstall("Foo.dll")

标签: .net installation gac global-assembly-cache


【解决方案1】:

强烈建议使用现有方法(如您提到的方法),因为它们都受 Microsoft 支持和维护,并将继续与未来的版本一起使用。

快速浏览一下gacutil.exeProcess Monitor 会发现它不仅仅是复制文件:

  • 并发问题(例如临时文件、锁定 WINDOWS\assembly\GACLock.dat 等)
  • 通知(例如HKLM\SOFTWARE\Microsoft\Fusion\GACChangeNotification\...
  • 索引(例如HKLM\SOFTWARE\Microsoft\Fusion\NativeImagesIndex...
  • 验证(例如强名称,...)

System.EnterpriseServices 中的包装器与this old blog post 非常相似,应该可以正常工作。

【讨论】:

    【解决方案2】:

    我们最近不得不为企业环境中的 10 台服务器执行此操作。我们使用 Wix 构建了一个非常简单的 MSI(认真 - 5 分钟的工作)并通过组策略发布到所有服务器(和开发框)。

    【讨论】:

    • 与我们所做的类似;我们使用 Visual Studio 构建了 .msi 安装项目。
    • 谢谢。最终使用了 MSI 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多