【问题标题】:GAC installation on every build - how to do it reliably每次构建时都安装 GAC - 如何可靠地安装
【发布时间】:2010-11-01 08:42:20
【问题描述】:

当我使用 Visual Studio 编译我的应用程序时,我希望在 GAC 中可靠地自动安装我的应用程序程序集。我在 Web 应用程序的构建中设置了构建前和构建后事件。

预构建事件:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe" /f /ul Uninstall.Gac.txt

发布构建事件:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe" /f /il Install.Gac.txt
%windir%\system32\inetsrv\appcmd.exe recycle apppool -apppool.name:"Sharepoint IIS WebApps"

如您所见,我还在回收我的 Web 应用程序池以使新程序集开始工作。

我遇到的问题是这是一个非常不可靠的过程。万一我的 Web 应用程序失败,我的下一个构建将失败,因为卸载将失败(构建后没有在以前的构建上运行)......等等。

我想让这个过程尽可能可靠。我想有条件地卸载和程序集,如果它们存在并强制安装,无论它们是否存在......但是预构建事件仍然很重要,原因如下:

重要

重要的是在构建之前完全卸载我的所有程序集,否则它们不会复制到我的输出目录(因为编译器在 GAC 中找到它们)因此 GAC 安装失败,因为它无法在输出中找到程序集 \ bin 文件夹。

我应该如何可靠地在我的 Web 应用程序版本上进行 GAC 卸载和安装?

【问题讨论】:

  • “妈妈,关于和被告谈话,我跟你说了些什么?” "To not to."
  • 您到底为什么要在您的开发机器和每次构建中执行此操作?我可以看到您的安装可能会在 GAC 中添加一些内容,但是关心开发框的唯一原因是这些内容是否用于 COM 互操作。谈论回收网络应用程序池表明这种可能性较小。
  • 因为我正在构建一个由 sharepoint 运行的 Web 应用程序,并且我将我的程序集放在 GAC 中,因此 Sharepoint Web 应用程序池能够访问/运行它们。因此,当我进行更改时,我会重新安装它们并回收 sharepoint 应用程序池以使更改生效。
  • 卸载时为什么要指定 /f 选项?
  • @Mike Dour:强制卸载以防正在使用。检查 gacutil 文档

标签: visual-studio-2010 gacutil global-assembly-cache build-events


【解决方案1】:

你不能仅仅依靠 GACUTIL 工具来编写 GAC 安装/卸载程序吗?使用代码,您至少可以依赖 hresults 错误代码并做出相应的反应。

可以在此处找到有关 GAC API 的信息:

http://blogs.msdn.com/b/junfeng/archive/2004/09/14/229649.aspx

【讨论】:

    【解决方案2】:

    如果构建成功,请将输出程序集复制到另一个目录并从那里安装到​​ GAC。并在预构建中使用此目录从 GAC 中删除这些程序集。

    这样,编译期间 GAC 中就不应该有任何程序集。只有在所有输出文件都存在时,通过在批处理文件中验证成功构建所有二进制文件,您才能调整构建后复制二进制文件。

    【讨论】:

    • 这有关系吗?如果编译器将在 GAC 中找到一个程序集,则无论该程序集从何处放入 GAC,它都不会将其复制到目标 bin 文件夹。我认为这是一个额外的不必要的步骤。
    • 好吧,我不得不处理这些 GAC 问题,因为我的应用程序组件被另一个程序使用,并且使用所描述的方法没有问题。顺便说一下,我正在将程序集路径传递给 gacutil,因此我需要将程序集存在于给定路径中,以便 gacutil 工作。
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多