c# - 有条件地改变目标框架版本

标签 c# visual-studio-2012 msbuild

我正在尝试将 #ifdef 代码库编译为两个不同的目标框架,即 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>

当我从“Release”切换到“Debug 40”时,目标框架不会在项目属性中更改(因此由于其他有条件引用的程序集而中断编译)。

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

编辑:我使用以下行从 v3.5 构建中排除 Microsoft.CSharp:

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

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

最佳答案

事实证明问题是双重的:

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

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

关于c# - 有条件地改变目标框架版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18588803/

相关文章:

c# - 当您的网络服务器在同一网络上时,如何通过网站获取远程计算机当前登录用户的用户名?

visual-studio - 可以同时使用 P4VS 和 P4SCC 吗?

c++ - 无法调用 MFC ActiveX 中的方法

jenkins - ASPRUNTIME : The application domain in which the thread was running has been unloaded.

msbuild - Linux 上的 JetBrains Rider EAP - 解决方案加载失败 : MsBuild not found

c# - 保证GC不会影响代码

c# - 如何使用 c# winforms 填充第三方应用程序的文本框?

c# - n 层以及每层需要的对象?

MSBuild TargetOutputs 不包含 Foo.exe.config 文件?

visual-studio - Visual Studio 2012 Entity Framework 连接中缺少 SQLite 数据源