Справочник по стандарту .net 2 с перерывом в перечислениях на .net 4.7.1, но работает на .net 4.6.1

Запустите новый проект, выберите консольное приложение .netcore2. Измените целевую платформу на .net 461. Это делается путем редактирования файла .csproj, как показано ниже:

<TargetFramework>net461</TargetFramework>

netcore уже много лет работает на полном фреймворке. так что никаких сюрпризов. Теперь добавьте новый проект: стандартную библиотеку классов .net 2.0. ваш .csproj в этой библиотеке теперь должен содержать

<TargetFramework>netstandard2.0</TargetFramework>

ссылайтесь на эту стандартную сборку 2 из своего консольного приложения. Ваш файл .csproj для консольного приложения теперь выглядит так:

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\LibStandard\LibStandard.csproj" />
  </ItemGroup>

создайте перечисление в вашей стандартной библиотеке .net 2

namespace LibStandard
{
    public class Class1
    {

    }

    public enum TestEnum
    {
        One, Two
    }

}

используйте указанное перечисление в своем консольном приложении

class Program
{
    static void Main(string[] args)
    {
        TestEnum t = TestEnum.One;
        Console.WriteLine("Hello World!");
    }
}

работает. прохладно. Теперь измените целевую платформу в консольном приложении на .net471. вот так

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net471</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\LibStandard\LibStandard.csproj" />
  </ItemGroup>

и теперь вы получите эту ошибку при сборке:

2>Program.cs(10,13,10,21): error CS0012: The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
2>Program.cs(10,26,10,34): error CS0012: The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
2>Program.cs(10,35,10,38): error CS0012: The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
2>Done building project "ConsoleOne.csproj" -- FAILED.

Я попытался добавить (через nuget) .netstandard 2.0.0 в проект консольного приложения, но это не решает проблему.

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net471</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="NETStandard.Library" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\LibStandard\LibStandard.csproj" />
  </ItemGroup>

Если вы еще не пробовали это раньше, вы всегда можете запустить стандартные библиотеки .net в 461 для стандарта 1.x. Но то же самое не работает для .netstandard 2 и 471. Вы также можете попробовать добавить новое консольное приложение (настольное приложение full netcore 471). Тот же результат. Начиная с консольного приложения .netcore, а затем ориентируясь на .netfx или запуская без ядра .net, возникает та же ошибка.

Я в тупике.

ОБРАЗЕЦ РЕШЕНИЯ: ОБРАЗЕЦ


person AppLS    schedule 10.11.2017    source источник
comment
Присоединяйтесь к обсуждениям на GitHub, например github.com/dotnet/standard/issues/514.   -  person Lex Li    schedule 10.11.2017
comment
добавлено на github.com/dotnet/corefx/issues/25177   -  person AppLS    schedule 10.11.2017


Ответы (1)


Кажется, это связано с командой VS https://github.com/Microsoft/msbuild/pull/2567

обходной путь работает: добавьте _HasReferenceToSystemRuntime

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net471</TargetFramework>
    <_HasReferenceToSystemRuntime>true</_HasReferenceToSystemRuntime>
  </PropertyGroup>

кажется, визуальная студия все еще немного запуталась, имея дело со стандартом .net

person AppLS    schedule 10.11.2017