繁体   English   中英

编译器指令如何与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)。 我曾经在两个独立的项目中维护这个库; 一个针对.NET 4.0和.NET 4.5编译的项目以及另一个编译.NETStandard1.0的项目。 然而,这种做法非常不方便,因为它迫使我维护两个项目并将项目文件从一个项目链接到另一个项目。

我现在正在尝试将它集成到一个单独的项目中,这应该很容易,因为新的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);
    }
}

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

  • Visual Studio中的语法高亮显示器会使public const string定义变灰。
  • 代码似乎仍然在net45框架下编译,因为编译C#编译器错误只是抱怨在.NETStandard,Version=1.3Bar不可用。
  • 查看bin \\ debug文件夹时,有一个带有已编译.dll的\\ net45文件夹,但\\ netstandard1.3文件夹为空。

凭借我有限的知识和经验,我希望上述设置能够正常运行,但不幸的是,它没有。 为什么会如此,以及如何使其发挥作用?

被命名为选项define ,而不是defines 所以要解决你的问题,只需:

{
"version": "1.0.0-*",

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

但是,您根本不需要定义这些指令,因为它们已经为您定义(请参阅此处获取列表)。 对于.NET 4.5,您已经有一个名为“NET45”的指令,而对于另一个框架,它的名称为“NETSTANDARD1_3”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM