Стандартная библиотека .NET устанавливает целевой препроцессор на NETSTANDARD2_0, когда вызывающей сборкой является .NET Framework 4.7.2? - PullRequest
0 голосов
/ 25 сентября 2018

Я создал три проекта: 2 консольных приложения, нацеленных на .NET Core 2.1 и .NET Framework 4.7.2 соответственно, и библиотеку .NET Standard (нацеленную как на .NET standard 2.0, так и .NET core 2.1, указав необходимые TFMв теге TargetFrameworks файла .csproj):

Вот единственный класс в стандартной библиотеке .NET:

public class StdClass
    {
        public string GetCallingPlatform()
        {
#if NETCOREAPP2_1
            return "Core2.1";
#elif NETCOREAPP2_0
            return "Core2.0";

#elif NETSTANDARD2_0
            return "Standard2.0";
#elif NET472
            return "NetFramework4.7.2";
#else
            return "NotSpecified";
#endif
        }

    }

Затем я добавил ссылку на эту библиотеку издва консольных приложения и в методе Main обоих я назвал GetCallingPlatform:

static void Main(string[] args)
    {
        StdClass stdClass = new StdClass();
        var platform = stdClass.GetCallingPlatform();
        Console.WriteLine(platform);
        Console.ReadLine();
    }

Консольное приложение .NET Core 2.1, как и ожидалось, поразило препроцессор NETCOREAPP2_1, но .NETКонсольное приложение Framework работает с препроцессором NETSTANDARD2_0. Я ожидал, что он попадет либо в блок NET472, либо в #else, поскольку TFM net472 не указан в TargetFrameworks

.

1 Ответ

0 голосов
/ 25 сентября 2018

Ваша совместно используемая библиотека классов будет скомпилирована для всех объявленных целевых платформ, каждая в своем собственном каталоге под bin\Debug, поэтому bin\Debug\netcoreapp2.1 и bin\Debug\netstandard2.0.

При компиляции этих версий, предназначенных для этих платформ,Директива компилятора будет применена.Версия .NET Standard вернет «Standard2.0», а версия .NET Core вернет «Core2.1».

После компиляции этой библиотеки ваши консольные приложения будут скомпилированы.Ваше приложение .NET Core будет ссылаться на версию библиотеки .NET Core (и, следовательно, печатать «Core2.1»), а версия .NET Framework 4.7.2, которая может ссылаться на библиотеки .NET Standard, будет печатать «Standard2.0».«- потому что это запекли в эту версию библиотеки.

...