编译器指令如何在 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,它们都有自己的编译器指令 NET45
和 NETSTANDARD
。到目前为止一切顺利,但是一旦我开始在我的代码中使用这些编译器指令,事情就停止了:
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 我的观察是:
- 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".
我正在创建一个针对多个平台(.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,它们都有自己的编译器指令 NET45
和 NETSTANDARD
。到目前为止一切顺利,但是一旦我开始在我的代码中使用这些编译器指令,事情就停止了:
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 我的观察是:
- 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".