编译器指令如何在 Visual Studio 2015 中与 project.json 一起使用

How do compiler directives work with project.json in Visual Studio 2015

我正在创建一个针对多个平台(.NET 4.0、.NET 4.5、.NETStandard1.0 和 .NETStandard1.3)的可重用库。我曾经在 2 个独立的项目中维护这个库;一个项目针对 .NET 4.0 和 .NET 4.5 编译,第二个项目编译 .NETStandard1.0。然而,这种做法非常不方便,因为它迫使我维护两个项目和从一个项目到另一个项目的 link 个项目文件。

我现在正尝试将它集成到一个项目中,这应该很容易,因为新的 project.json 结构允许我们用 buildOptions 指定 frameworks。不幸的是我卡住了,我的项目不再编译了。这让我相信我对这个构建系统的工作方式有错误的看法。

为了演示我的问题,我将其简化为以下 project.json:

{
  "version": "1.0.0-*",

  "frameworks": {
    "net45": {
      "buildOptions": {
        "defines": [ "NET45" ]
      }
    },
    "netstandard1.3": {
      "buildOptions": {
        "defines": [ "NETSTANDARD" ]
      },
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      }
    }
  }
}

该项目包含两个框架:.NET 4.5 和 .NETStandard 1.3,它们都有自己的编译器指令 NET45NETSTANDARD。到目前为止一切顺利,但是一旦我开始在我的代码中使用这些编译器指令,事情就停止了:

using System;

public class Foo
{
#if NET45
    public const string Bar = "NET45";
#endif
#if NETSTANDARD
    public const string Bar = "NETSTANDARD";
#endif

    public Foo()
    {
       System.Console.WriteLine(Bar);
    }
}

根据给定的配置和 class 我的观察是:

以我有限的知识和经验,我希望上述设置能够工作,但不幸的是它没有。为什么会这样,应该怎么做才能让它发挥作用?

该选项名为 define,而不是 defines。因此,要解决您的问题,只需执行以下操作:

{
"version": "1.0.0-*",

"frameworks": {
  "net45": {
    "buildOptions": {
      "define": [ "NET45" ]
    }
  },
  "netstandard1.3": {
    "buildOptions": {
      "define": [ "NETSTANDARD" ]
    },
    "dependencies": {
    "NETStandard.Library": "1.6.0"
    }
  }
  }
}

但是,您实际上根本不需要定义这些指令,因为它们已经为您定义了(请参阅 here 获取列表)。对于 NET 4.5,您已经有了名为 "NET45" 的指令,而对于另一个框架,它被命名为 "NETSTANDARD1_3".