1

当我想使用异步 CTP 关键字时,我在这里遇到了一个问题。所有开发人员机器都是 VS2010,因此需要安装异步 CTP - 已经完成并且使用这些功能编写了代码。但是,当我开始提交此代码时,我意识到我们的构建服务器安装了 VS2012(因此安装了 .NET 4.5),因为另一个团队需要 C++11 功能并共享此资源。

这意味着持续构建服务器会导致我们的 C# 构建失败,因为它们现在针对 .NET 4.0(我们仍然有 WinXP 用户计算机)使用异步方法以及启用这些新关键字的 CTP 方法。通过将异步目标包安装到这些项目中,我得到了其他编译​​错误(同一类定义了两次,一次在 CTP 中,一次在异步目标包中)。

有没有办法让这两种方法很好地结合在一起?显然,我们完全打算尽快让所有开发人员在 VS2012 上工作 - 更不用说让我们的用户启动并运行 .NET 4.5,但这超出了问题的范围。

我有一个解决方案,我已在下面回答,但希望得到任何反馈。

4

2 回答 2

1

我宁愿建议将开发机器更新到 VS2012,而不是针对两个真正不同的库 - AsyncCTP 和 Async Targeting Pack 进行构建。这些不仅仅是可互换的,它们的实现方式也不同,并且可能会发生,您的代码将与 AsyncCTP 一起使用,而不是在 ATP 中。

将您的项目更新到具有本机 async/await 支持的 .NET 4.5 可能是这里的最佳解决方案。

于 2012-10-24T09:11:01.870 回答
0

我对上述问题的解决方案是在所有“启用异步”的 .csproj 文件中使用条件引用:

<Reference Include="AsyncCtpLibrary" 
  Condition="'$(BuiltOnNet45)'==''">
  <HintPath>..\..\lib\AsyncCtpLibrary.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CompilerServices.AsyncTargetingPack.Net4" Condition="'$(BuiltOnNet45)'=='true'">
  <HintPath>..\..\lib\Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll</HintPath>
</Reference>

然后,当我使用我们的 VS2012 构建机器进行构建时,我使用 msbuild.exe 标志“/p:BuiltOnNet45=true” - 并在使用我们的开发机器时将其关闭。由于空白是默认值,因此该解决方案允许我们在 VS2010 中加载和使用解决方案而不会出现问题。如果我也使用 VS2012 IDE,我将不得不对此进行调整,但我不需要这个。

于 2012-10-23T09:05:36.640 回答