代码之家  ›  专栏  ›  技术社区  ›  Paul Hollingsworth

使构建过程独立于GAC

  •  4
  • Paul Hollingsworth  · 技术社区  · 17 年前

    我们如何使.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的计算机上,即使a.dll的“copy local=true”,b.dll也不会被复制到输出目录中。

    3 回复  |  直到 17 年前
        1
  •  4
  •   Paul Hollingsworth    17 年前

    就像马克建议的那样,唯一的方法就是添加依赖引用并设置copyloc=true。

    但我同意丹尼的回答——不要使用dev studio进行部署,因为您无法获得对构建过程的足够控制。

    为什么?在dev studio中有一些“默认”逻辑,如果它计算了一个属性的值,那么它就不会将其保存到.csproj文件中,将dev studio实例留在另一台计算机上,“默认”该属性的任务留给其他对象!

    唯一无错误的方法是直接显式编辑.csproj xml文件,并确保已向引用元素添加了true:

    <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
  •  1
  •   TheSmurf    17 年前

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

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

        3
  •  0
  •   Marc Gravell    17 年前

    最简单的答案是显式的:添加对b.dll的引用,并根据需要设置它。

    推荐文章