c# - 编译器指令如何与 Visual Studio 2015 中的 project.json 一起使用

标签 c# .net visual-studio visual-studio-2015 project.json

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

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

为了演示我的问题,我将其简化为以下 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# 编译器错误仅提示 Bar.NETStandard,Version=1.3 下不可用.
  • 查看 bin\debug 文件夹时,有一个\net45 文件夹,其中包含已编译的 .dll,但\netstandard1.3 文件夹是空的。

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

最佳答案

该选项名为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”。

关于c# - 编译器指令如何与 Visual Studio 2015 中的 project.json 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40632171/

相关文章:

c# - 无法让 Blazor WASM AAD 应用程序角色工作

c# - 绑定(bind)IP地址

.net - 如何确保无法验证的 .NET 程序集有效?

c# - .NET 密码学中 MACTripleDES 和 HMAC 的区别

c++ - visual studio 2010 和 gcc/g++ 4.6.3 之间 iostream 行为的意外差异

c# - VS Code/OmniSharp - 如何明确设置 dotnet SDK/CLI 工具的路径

.NET 字符串与流 - 内存配置文件和特征

c# - 在Visual Studio中,为什么所有文件都自动成为我的C#项目的一部分?

c# - visual studio -- 无法从解决方案资源管理器中删除文件

c# - 使用 Visual Studio 2010 从命令行构建 C# 解决方案