У нас есть серия. 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
.