如何创建针对.NET 2.0和.NET Standard的库?

Bot*_*ázs 6 .net c# .net-core asp.net-core .net-standard

我有一个目前支持.NET 2.0+ 的小型库

我不使用更高版本框架的任何功能,因此保持2.0支持会很好,但我也想针对.NET Core(或更准确地说,.NET Standard)。

我试图将两个框架都添加到project.json

"frameworks": {
  "net20": {},
  "netstandard1.6": {
    "imports": "dnxcore50"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我的库需要在.NET Standard(System.ReflectionMicrosoft.AspNetCore.WebUtilities)上运行的NuGet软件包与.NET 2.0不兼容。

如何在不使用几乎相同的代码维护两个完全独立的项目的情况下解决此问题?

Tse*_*eng 5

如果您依赖Microsoft.AspNetCore.*软件包,则不能这样做,因为支持.NET Standard 的绝对最低要求是.NET 4.5。

.NET 4.5是System.Runtime.NET Core所基于的第一个版本。但是,当您仔细考虑时,这也没有任何意义。如果您的库中需要对ASP.NET Core的支持。

如果您的库应该为ASP.NET Core和ASP.NET 4(即MVC 5,WebApi 2)运行,则需要有条件地使用ASP.NET依赖关系并使用#if预处理程序指令。

"frameworks": {
  "net20": {
    "dependencies": {
      "NameOf.AspNetLegacyPackage": "1.2.3"
    }
  },
  "netstandard1.3": {
    "dependencies": {
      "Microsoft.AspNetCore.WebUtilities" : "1.1.0"
    },
    "imports": "dnxcore50"
  }
}
Run Code Online (Sandbox Code Playgroud)

我用的netstandard1.3是这的最小值Microsoft.AspNetCore.WebUtilities,但是根据您的其他依赖关系,您可能需要提高或降低。

NameOf.AspNetLegacyPackage是程序包的名称,该程序包包含所需的功能Microsoft.AspNetCore.WebUtilities,但可以在.NET Framework 2.0上运行(如果有)。如果不是,则必须将其删除并自己编写替换功能。

然后在你的代码中使用

#if NETSTANDARD1_3
    // Code or APIs which is only available in netstandard1.3/net4.6 
    // this includes the Microsoft.AspNetCore.WebUtillities
#else
    // Use code or API which runs under .NET Framework 2.0
#endif
Run Code Online (Sandbox Code Playgroud)

另外,如果您要放弃对.NET Framework 2.0的支持并转而使用4.5.1,则可以在两种版本中继续使用它Microsoft.AspNetCore.WebUtillities(请参见NuGet页面以获取相关性)

"dependencies": {
  "Microsoft.AspNetCore.WebUtilities" : "1.1.0"
},
"frameworks": {
  "net451": {
  },
  "netstandard1.3": {
    "imports": "dnxcore50"
  }
}
Run Code Online (Sandbox Code Playgroud)