2

我有一个小项目,我想要该项目的 2 个编译版本:

  • 一种针对 .NET 2.0 框架的
  • 一个针对 .NET 3.5 框架的

一切顺利;我已经将我的项目置于持续集成之下(使用 CC.NET),并且我创建了 2 个 CC.NET “项目”。每个目标框架一个项目。

我不会过多介绍(不相关的)细节,但我的解决方案设置为针对 VS.NET 中的 .NET 3.5 框架。

我有 2 个 msbuild 任务:

  • 为 .NET 3.5 构建解决方案的一项任务(简单易行)
  • 为 .NET 2.0 构建解决方案的一项任务

    在此任务中,我调用 MSBuild,并指定 TargetFrameworkVersion 应为 v2.0。我还定义了一些额外的构建条件(因此 .NET3.5 特定代码不会内置在针对 .NET2.0 的程序集中)。

到现在为止还挺好。一切正常。然而,现在的问题是:

我的解决方案有一些依赖项(对第 3 方程序集的引用)。在 VS.NET 中,我将这些依赖项的“本地复制”设置为 true。当 CC.NET 构建我的 .NET3.5 版本的程序集时,第 3 方依赖项确实被复制到了我的输出目录中。

但是,当 CC.NET 构建我的 .NET2.0 版本的程序集时,依赖项不会复制到我的输出目录中。(然后,这会导致我的单元测试失败)。

我现在的问题是:我如何对 msbuild 说,在构建我的项目的 .NET2.0 版本时必须将某些第 3 方引用复制到本地?或者,有没有其他方法可以实现这一点,因为我不想在我的构建脚本中再次指定每个依赖项。我猜这很快就会成为维护的噩梦。

4

3 回答 3

2

我一直在重新审视这个问题,因为我不喜欢手动更改 csproj 文件。(当我更改引用时,我一定不要忘记再次调整 csproj 文件,将 Private 节点再次设置为 true)。

所以,我一直在研究 MSDN,我偶然发现了这个:

ResolveAssemblyReference.TargetFrameworkDirectories 属性

备注此属性是确定结果项的 CopyLocal 状态所必需的。

如果未指定此属性,则没有结果项目的 CopyLocal 值为 true,除非它们在其源项目上显式地具有私有元数据值 true。

因此,这意味着还有另一种可能性,那就是设置 ResolveAssemblyReference 任务的 TargetFrameworkDirectories。但是,有没有人知道如何做到这一点?
我一直在尝试不同的东西,但似乎没有任何效果......

我试过这个:

<ItemGroup>
    <TargetFrameworkDir Include="$(SystemRoot)\Microsoft.NET\Framework\v2.0.50727" />
</ItemGroup>

<PropertyGroup>
   <TargetDirsToUse>@(TargetFrameworkDir)</TargetDirsToUse>
</PropertyGroup>

<ResolveAssemblyReference TargetFrameworkDirectories="$(TargetDirsToUse)" />

但无济于事......也许其他人知道如何做到这一点,或者有一个黄金提示。(我在这个该死的问题上花了很多时间)。

于 2009-06-29T09:51:12.380 回答
1

通过确保不从 GAC 引用程序集,我已经能够解决这个问题。相反,我在我的项目中创建了一个包含第 3 方程序集的“lib”目录。在我的解决方案中,我从那里引用第 3 方程序集,并设置 copy local==True。

除此之外,您还必须确保在您的 csproj 文件中,引用的程序集具有一个 Private 标记,其值设置为 true。像这样:

<Reference Include="...">
   <SpecificVersion>False</SpecificVersion>
   <HintPath>...</HintPath>
   <Private>True</Private>
</Reference>
于 2009-02-16T10:28:09.267 回答
0

一个问题:如果您尝试在 VisualStudio 中编译您的 2.0 解决方案/项目会发生什么?第三方引用是否自动复制?

奇怪的是,这适用于 3.5 而不是 2.0。我自己没有进行任何并行构建,但是当我将我的项目从 2.0 转换为 3.5 时,无论 .NET 版本如何,都会复制所有第 3 方引用。

BTW: I never reference 3rd party libraries from GAC (only those from Microsoft, and even not all of them). I always copy them to my lib directory structure, add them to the source control and reference them from there. Using assemblies from GAC is bad practice as far as I am concerned, since it represents an unnecessary dependency on a development machine setup.

Example of such a directory: http://code.google.com/p/projectpilot/source/browse/#svn/trunk/lib

于 2009-07-01T18:39:30.833 回答