【问题标题】:Making build process independent of GAC使构建过程独立于 GAC
【发布时间】:2009-02-05 14:53:40
【问题描述】:

我们如何才能使 .NET 项目的构建过程 (Dev Studio 2005) 完全独立于运行它的特定机器上的 GAC 上安装的内容。

这是我们试图解决的问题:根据碰巧安装到 GAC 中的程序集,我们的构建过程会在输出目录中生成不同的 .NET 程序集,然后我们使用这些程序集来构建 .MSI

这大概是因为 dev studio 假设,因为它安装在 GAC 中,所以它不应该作为我们产品的一部分安装。

我们希望禁用此行为,以便我们的项目直接或间接引用的所有 .NET 程序集都被复制到项目的输出目录中(.NET 2.0 运行时标准程序集除外)。

对于 直接 程序集引用,我知道设置“Copy Local=True”可以做到这一点。

但是,这不适用于间接程序集引用。

即我们的一个项目引用了一个名为“A.dll”的程序集,该程序集依赖于另一个名为“B.dll”的程序集,该程序集与“A.dll”位于同一目录中。在 GAC 中未安装“B.dll”的机器上,A.dll 和 B.dll 都将复制到 Dev studio 构建过程中的输出目录。这就是我们想要的。

但是在将 B.dll 安装到 GAC 的机器上,即使 A.dll 的“Copy Local = True”,B.dll 也不会被复制到输出目录中。

【问题讨论】:

  • 我遇到了相反的问题。我的构建框在 gac 中没有任何内容,所以太多内容正在发布到我的 Web 应用程序

标签: .net visual-studio-2005 gac


【解决方案1】:

就像 Marc 建议的那样,唯一的方法是添加依赖引用并设置 CopyLocal=True。

但我开始同意 Danny 的回答 - 不要使用 Dev Studio 进行部署,因为您无法充分控制构建过程。

为什么? Dev Studio 有一些“默认”逻辑,如果它已经计算了一个属性的值,那么它不会将它保存到 .CSPROJ 文件中,而将 Dev Studio 实例留在另一台机器上的任务是“默认” " 属性到别的东西!

唯一没有错误的方法是直接显式编辑 .csproj xml 文件并确保您已将 True 添加到 Reference 元素:

<ItemGroup>
    <Reference Include="ConfigManagerClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=20fc1ffb797ec904, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\thirdparty\CM\ConfigManagerClient.dll</HintPath>
    <!-- If DevStudio inferred this to be true, then it won't explicitly save it.
         When the project is loaded on another machine on which the assembly is
         installed in the GAC,
         Dev Studio on _that_ machine will infer that CopyLocal should be False!!
     -->
    <Private>True</Private>
</Reference>

这种行为似乎使您几乎不可能知道您的 .CSPROJ 文件在另一台机器上运行时会做什么。

从长远来看,最好不要将构建和打包过程委托给 Dev Studio,而只是使用 Nant 和显式命令行。

【讨论】:

    【解决方案2】:

    我认为您可能不应该依赖 Visual Studio 构建过程自动为您执行此操作,尤其是当结果可能因构建机器而异时。

    在这种情况下(无论您是使用 Visual Studio 构建还是使用自动构建脚本,这都适用)我会做一些构建后脚本(为了简单起见,我通常使用批处理文件)复制您的所有程序集项目需要在构建后立即进入适当的目录(我通常将不属于我的项目的任何程序集保存在我的源代码管理的目录中,以便它们都在一个地方)。然后,当您构建安装程序时,一切都在它需要的位置。

    【讨论】:

      【解决方案3】:

      最简单的答案是明确的:添加对 B.dll 的引用并根据需要设置它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 2010-09-06
        • 1970-01-01
        相关资源
        最近更新 更多