Visual Studio 2012中的配置管理是否与TargetFrameworkVersion有关?

时间:2014-04-16 17:51:56

标签: .net visual-studio-2012

传统上,我曾经在构建配置之间手动切换:debug,full release和lite release。它们中的最后一个不仅排除了额外的功能,而且还兼容.NET 3.5而不是常规的.NET 4.5目标。在.NET版本之间切换也是手工完成的,这导致了项目的自动关闭和重新打开。

随着项目规模的扩大,现在是时候把它分成几部分了。当然,为一堆项目手动切换配置和平台并不好笑,所以我编辑了 .proj 文件并将TargetFrameworkVersion指令放入条件部分,就像在这里和其他的许多示例中一样位点。

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <DefineConstants>dotNet=4.5, HaveTesting=True, HaveDumper=True</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'RlzFull' ">
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <DefineConstants>dotNet=4.5, HaveTesting=False, HaveDumper=True</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'RlzLite' ">
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
    <DefineConstants>dotNet=3.5, HaveTesting=False, HaveDumper=False</DefineConstants>
</PropertyGroup>
<PropertyGroup  Condition=" '$(Configuration)' == 'Debug' ">
    <DebugType>full</DebugType>
    <DebugSymbols>true</DebugSymbols>
    <DefineDebug>true</DefineDebug>
    <DefineTrace>true</DefineTrace>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' != 'Debug' ">
    <DebugType>none</DebugType>
    <DebugSymbols>false</DebugSymbols>
    <DefineDebug>false</DefineDebug>
    <DefineTrace>false</DefineTrace>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <Prefer32Bit Condition=" $(TargetFrameworkVersion.Substring(1)) &gt;= 4.5 ">true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'x86' ">
    <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'x64' ">
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

显然,适用于手动启动的MSBuild 。无论是否意外,所有示例作者都写过关于构建例程的手动调用。此外,其中一些添加了:“您只选择一个配置在Visual Studio中使用”。

但是,至少在主题“Conditionally changing target framework version”中暗示可以在Visual Studio中以交互方式更改配置:GUI仍将在项目属性中显示以前的.NET版本窗口,但编译器将使用正确的库。但它似乎对我不起作用:当在GUI中选择另一个需要不同.NET版本的配置时,前一个(默认值为?)代替使用 ,即使重新开放解决方案。

构建输出日志显示第一个项目( LibUtil.dll )已成功编译。但是,在检查构建的程序集时,可以看到它是针对.NET 4.x的,因为它引用了 mscorlib.dll 4 .0.0.0和< em> System.dll 2 .0.0.0。手动构建时,两个引用的库的.NET 3.5配置版本 2 .0.0.0,.NET 4.5配置版本 4 .0.0.0。

所有后续项目在日志中都有一堆类似的错误:

error BC30002: Type 'FooClass.BarClass' is not defined.
error BC30451: 'FooClass' is not declared. It may be inaccessible due to its protection level.
warning MSB3258: The primary reference "...\LibUtil.dll" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Windows.Forms, Version=4.0.0.0, ..." which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
warning MSB3268: The primary reference "...\LibUtil.dll" could not be resolved because it has an indirect dependency on the framework assembly "System.Web.ApplicationServices, Version=4.0.0.0, ..." which could not be resolved in the currently targeted framework.

请注意警告:对于实际仅引用SystemSystem.Core的简单库项目,日志声明它引用了几十个.NET库,包括之前从未听说过的那些。 : - )

所以,问题是:是否真的可以在Visual Studio中更改目标.NET版本以及构建配置,还是仅在手动运行MSBuild时才可以?我希望CLI和GUI中的体验应该是相同的。如果没有能力在IDE中测试不同的配置并轻松跟踪错误,Visual Studio并不比使用IntelliSense的记事本更好。

更新1 。显然,GUI行为确实与CLI不一致:当我尝试使用分层Choose - When - Otherwise样式的条件项目描述时,IDE中的配置管理器停止识别已定义的配置和平台根本,显示“Debug”和“Any CPU”(原文如此)作为每个项目的唯一选项。奇怪的是,当尝试添加具有已在 .proj 文件中定义的名称的新配置或平台时,IDE会确认此项已存在。

更新2 。在针对不同.NET版本的配置之间切换并以上面列出的方式进行描述,可能会导致Visual Studio 2012在每次尝试时崩溃。除非您想通过删除 .suo 文件来放弃所有断点等,否则卸载除最简单的项目之外的所有项目然后切换配置可能会有所帮助 - 之后可能会加载其他项目安全回来。另一种选择是编辑项目文件并暂时排除指向先前版本的所有TargetPlatformVersion指令,然后将解决方案配置切换为安全值(例如“Debug”),然后恢复项目文件。

1 个答案:

答案 0 :(得分:1)

我在问题中提到的所有问题都被证实是Visual Studio IDE的缺点:

  • Bug 868869 - 将TargetFrameworkVersion从4.5切换到3.5会使IDE编译不稳定
  • Bug 868917 - IDE忽略“选择时阻止块”
  • 中的项目配置和平台定义

(回应那里的微软家伙不小心互相切换了答案,所以不要混淆。)总之,他们确实承认这种行为不是故意的,但他们从未打算实现在CLI和IDE中具有相同的性能 - 并且不会出现在可预见的新版本中,即使某些不一致可能导致IDE崩溃到完全不可用的程度。