带有枚举的.net标准2引用在.net 4.7.1上打破但在.net 4.6.1

时间:2017-11-10 02:38:44

标签: .net-core .net-core-2.0 .net-standard-2.0 .net-4.7

启动新项目,选择.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>

现在你将在build上遇到这个错误:

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>

如果您之前没有尝试过这种方法,则可以始终在461中为1.x标准运行.net标准库。但这同样适用于.netstandard 2和471.您还可以尝试添加新的控制台应用程序(桌面应用程序完整的netcore 471)。结果相同。从.netcore控制台应用程序开始,然后以.netfx为目标或从.net核心开始,会出现同样的错误。

我很难过。

示例解决方案:SAMPLE

1 个答案:

答案 0 :(得分:2)

似乎与VS团队有关 https://github.com/Microsoft/msbuild/pull/2567

解决方法似乎有效:添加_HasReferenceToSystemRuntime

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

似乎视觉工作室仍然有点混淆处理.net标准