Сборка проекта для .NET и .NET Core

170
25 февраля 2019, 23:00

При написании библиотеки, код которой валиден как для .NET Framework, так и для .NET Core, приходится создавать два разных проекта со своими зависимостями и практически одинаковым кодом.

Текущее положение дел (необходимость отдельно обновлять код соседнего проекта и отдельно его собирать) меня не очень устраивает. И пусть я написал скрипт для автоматизации этого, знаю, что есть решение получше. Можно как-то модифицировать сам проект в Visual Studio для достижения таковых целей:

  • Возможность выбирать целевую платформу
  • В зависимости от неё указывать символы в духе NETCORE, NET (по типу DEBUG), дабы в некоторых местах менять платформо-зависимый код
  • В зависимости от неё использовать определённые пакеты

Как лучше организовать решение поставленной задачи?

Answer 1

При использовании SDK based формата для файлов проекта (.csproj) можно указать несколько целевых платформ для сборки в элементе TargetFrameworks. Также можно использовать атрибут Condition для условного указания зависимостей.

Test.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <LangVersion>Latest</LangVersion>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>
      netcoreapp2.1;
      net472;
    </TargetFrameworks>
  </PropertyGroup>
  <PropertyGroup Condition="$(Platform) == 'AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>
  <ItemGroup Condition="$(TargetFramework) == 'netcoreapp2.1'">
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
  </ItemGroup>
  <ItemGroup Condition="$(TargetFramework) == 'net472'">
    <PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
  </ItemGroup>
</Project>

Test.cs:

using System;
namespace Test {
    class Program {
        static void Main() {
            Console.WriteLine("Hello World!");
#if NETFRAMEWORK
            Console.WriteLine(".NET Framework");
            Console.WriteLine((System.Numerics.Vector<byte>)new System.Numerics.Vector<int>(42));
#elif NETCOREAPP
            Console.WriteLine(".NET Core");
            Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(new { a = 1, b = 2 }));
#else
            Console.WriteLine("Unknown");
#endif
        }
    }
}

Gist

Answer 2

отдельно обновлять код соседнего проекта

у Вас две копии кода?

Положите cs файлы в третье место и добавьте их в оба проекта, используя опцию "Add As Link" в окне "Add Existing File".

READ ALSO
Внедрение через конструктор

Внедрение через конструктор

Изучаю внедрение зависимостей, появился вопросМожет ли быть такое что два класса зависят друг от друга как в примере ниже

157
Для чего нужен делегат Action

Для чего нужен делегат Action

Что есть делегат Action и когда нужно его использовать?

153
Подключение dll в скриптах MindDecider

Подключение dll в скриптах MindDecider

Как в MindDecider в скрипте подключить свою библиотеку dll?

146