预处理程序如何链接到不同的目标框架?

时间:2018-09-24 16:19:23

标签: c# msbuild .net-standard

我跟随a talk by Immo Landwerth,在一个.NET标准项目中,我看到他从左上方的下拉菜单中在项目(通常不是解决方案下的项目)之间切换,这是一个gif:https://image.ibb.co/mmjoHU/pre.gif

要重现相同的内容,我在.NET Framework中创建了一个类库以查看运行情况,但是项目加载失败(修改后的csproj文件与演示文稿的csproj相同),然后我创建了一个.NET标准库,并将.csproj文件修改为此(与the demo's csproj相同):

<Project Sdk="MSBuild.Sdk.Extras">

  <PropertyGroup>
    <TargetFrameworks>netstandard1.4;net461;uap10.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.ValueTuple" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.Device" />
  </ItemGroup>

</Project>

我可以看到三个目标框架:netstandard1.4; net461; uap10.0。但实际上无法理解它们如何映射到预处理器:NET461,WINDOWS_UWP。可以在Immo的项目中使用,但不能与修改后的.NET标准库一起使用,并且三个目标都没有出现。

1 个答案:

答案 0 :(得分:0)

在我看来,带有链接的.cs文件的条件编译符号。

在“属性”>“构建”选项卡中,您应该看到一个标记为“条件编译符号”的文本框。您在此文本框中输入的任何字符串都可以用于有条件地使用#if#elif执行代码。还有一些构建系统已经知道的符号(在here中列出了一些符号)。

Build tab

我假设这些项目还共享相同的.cs文件,这说明了#if /#elif /#else条件在同一文件内“翻转”(将文件添加到项目时,选择将其添加为链接到现有文件,则不会创建副本)。

Add as link

我已经在多个项目中针对不同的配置执行了此操作,并且行为与您发布的.gif匹配。