Пакет NuGet, адресованный нескольким стандартным фреймворкам - PullRequest
0 голосов
/ 10 марта 2020

У нас есть серия. Net Core 3.1 приложений. Мы абстрагировали общий код в виде пакетов .NetStandard 2.1 NuGet и сделали их доступными на нашем частном сервере NuGet.

Таков был успех этих пакетов NuGet, нас попросили сделать их доступными для других наших приложений, которые написано в. Net Framework 4.8.

Мы следовали совету Microsoft ( Поддержка нескольких. NET версий Framework в файле вашего проекта ), и это прекрасно работало для все, кроме одного из наших пакетов ....

Итак, что же такого в этом?

В этом пакете используются обнуляемые значения. Я могу заставить проект компилироваться просто отлично, но это тестовый проект (.NetCore 3.1), который генерирует исключения. Я go сначала рассмотрю изменения кода, которые мы сделали в стандартном проекте, а затем посмотрю на проект Test - надеюсь, кто-то обнаружит, в чем мы ошиблись.

. Net Стандартный проект

.csproj файл

Изменено

<TargetFramework>netstandard2.1</TargetFramework>

на

<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>

Также перемещено <Nullable>enable</Nullable> в свой собственный раздел

  <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2_1' ">
    <Nullable>enable</Nullable>
  </PropertyGroup>

Класс

Затем у нас есть файл класса. Я не буду беспокоиться о показе базового класса, но он следует похожему шаблону:

public class MyClass<T> : MyBaseClass
        where T : struct
{
    public MyClass()
        : this(default)
    {
    }

#if netstandard2_1
    public MyClass(T? item)
        : base(true, 0, null)
    {
        this.Item = item;
    }
#else
    public MyClass(T item)
        : base(true, 0, null)
    {
        this.Item = item;
    }
#endif

#if netstandard2_1
    public T? Item { get; set; }
#else
    public T Item { get; set; }
#endif
}

Это компилируется, и в папке bin / release (или bin / debug) вы видите две папки, одна для netstandard2.1 и еще один для netstandard2.0 с ожидаемой DLL в каждой.

Однако проверка этого класса в обеих DLL с помощью ILSPY показывает, что они идентичны ... не видно вопросительного знака. Не уверен, является ли это артефактом ILSPY или действительным ....

Тестовый проект

Таким образом, тестовый проект имеет ссылку на проект Standard (так , это не ссылка на пакет NuGet).

В одном из моих тестов:

Guid? g = null;
var actual = new ItemValueOperationResponse<Guid>(g);

, что приводит к следующей ошибке:

CS1503 Аргумент 1: невозможно преобразовать из 'System.Guid?' to 'System.Guid'

Но этот тестовый проект. Net Core 3.1, поэтому он должен использовать код Standard2.1.

Я попытался обменять последовательность в * .csproj, так что он читается как <TargetFrameworks>netstandard2.1;netstandard2.0</TargetFrameworks>, но безрезультатно.

Также пробуется в верхнем регистре: #if NETSTANDARD2_1.

1 Ответ

0 голосов
/ 17 апреля 2020

Закончились регионы в нашем тестовом проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...