Как директивы компилятора работают с 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".

Другие вопросы по тегам