使构建过程独立于GAC

时间:2009-02-05 14:53:40

标签: .net visual-studio-2005 gac

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

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

据推测,这是因为开发工作室假设,因为它已安装在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复制到输出目录中。

3 个答案:

答案 0 :(得分:4)

与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和显式命令行。

答案 1 :(得分:1)

我认为你可能不应该依赖Visual Studio构建过程自动为你做这件事,特别是当结果因建筑机器而异时。

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

答案 2 :(得分:0)

最简单的答案是明确:添加对B.dll的引用并按照您想要的方式设置它。

相关问题