【问题标题】:Conditionally changing target framework version有条件地改变目标框架版本
【发布时间】:2026-02-02 19:25:02
【问题描述】:

我正在尝试将 #ifdef'd 代码库编译为两个不同的目标框架,即 3.5 和 4.0。

我尝试修改解决方案中的.proj文件无济于事。

似乎 MSBuild / VS2012 没有通过 UI 获取解决方案配置更改。

这是 .proj 文件之一的片段:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>..\Binaries\</OutputPath>
    <DefineConstants>TRACE;NET35</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug 40|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>..\Binaries\</OutputPath>
    <DefineConstants>TRACE;DEBUG;NET40</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  </PropertyGroup>

当我从“发布”切换到“调试 40”时,目标框架在项目属性中没有改变(因此由于其他条件引用的程序集而中断了编译)。

我在有条件地引用不同的程序集时也遇到了问题,就像 VS/MSBuild 没有选择解决方案配置一样(有些甚至没有出现在引用中)。

编辑:我将 Microsoft.CSharp 从 v3.5 版本中排除,使用以下行:

<Reference Include="Microsoft.CSharp" Condition=" '$(Configuration)' == 'Debug 40'" />

到目前为止,似乎只是忽略了 TargetFrameworkVersion 属性。

【问题讨论】:

  • 你确定这不仅仅是一个 VS GUI 问题,因为当我制作我的调试 3.5 版本时,它无法针对 4.0 csharp dll 进行编译(如你所料)。我用反射器检查构建的 dll。
  • @JamesWoolfenden 我也在有条件地引用 Microsoft.Csharp。我将编辑问题。
  • 嗨,雷恩。这就是我的观点,我认为正在使用正确的框架,否则它为什么会失败。我认为它只是ui没有更新。如果您在命令行中使用 msbuild 构建它,您将看到 CoreCompile 任务中使用的是哪个框架
  • 你好@JamesWoolfenden,感谢您的帮助!我注意到在一个项目中它只是 Resharper 突出显示错误,但编译很好。在另一个项目中,MSBuild 似乎忽略了一些条件引用。我现在无法确定确切的问题。
  • 我遇到的最好的文章。 alandean.blogspot.com/2011/02/…我不喜欢你有相同的输出路径的方式,顺便说一句。

标签: c# visual-studio-2012 msbuild


【解决方案1】:

原来问题是双重的:

  • ReSharper (v7) 通过显示跨不同文件的编译错误使事情变得更难,从而更难实现实际使用条件引用编译的代码。我认为版本 7 不支持手动更改项目文件,因此请注意 RS7 用户。
  • VS2012 未更改 UI 中的目标框架(尽管在编译时实际上使用了正确的框架,如 MSBuild 的详细输出所示)。

我最终还是有点耐心地编译了代码库。 根据@granataCoder 的建议,最好保留不同的输出路径(在处理条件编译等正交问题时可能很容易忽略)。

【讨论】: