Как директивы компилятора работают с project.json в Visual Studio 2015
Я создаю многократно используемую библиотеку, предназначенную для нескольких платформ (.NET 4.0, .NET 4.5, .NETStandard1.0 и.NETStandard1.3). Я имел обыкновение поддерживать эту библиотеку в 2 отдельных проектах; один проект скомпилирован с использованием.NET 4.0 и.NET 4.5, а второй проект скомпилирован.NETStandard1.0. Эта практика, однако, очень неудобна, так как вынудила меня поддерживать два проекта и связывать файлы проектов из одного проекта в другой.
Сейчас я пытаюсь интегрировать это в один проект, что должно быть легко, потому что новая структура project.json позволяет нам определять frameworks
с buildOptions
, К сожалению, я застрял, и мой проект больше не компилируется. Это заставляет меня думать, что у меня неправильное представление о том, как работает эта система сборки.
Чтобы продемонстрировать свою проблему, я сократил это до следующего 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);
}
}
С данной конфигурацией и классом мои наблюдения таковы:
- Подсветка синтаксиса в Visual Studio затеняет оба
public const string
определения. - Тем не менее, кажется, что код компилируется в рамках Net45, потому что ошибка компиляции C# исключительно жалуется на
Bar
быть недоступным под.NETStandard,Version=1.3
, - При поиске в папке bin \ debug, есть папка \net45 с скомпилированным.dll, но папка \netstandard1.3 пуста.
С моими ограниченными знаниями и опытом я бы ожидал, что вышеуказанная установка будет работать, но, к сожалению, это не так. Почему это так, и что нужно сделать, чтобы это работало?
1 ответ
Опция названа 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".