在.net 4.6.2中使用.net标准1.5 lib错过了System.Runtime 4.1.0.0

在.net framework 4.6.2 consoleapps中使用.net标准时遇到了一些问题。

我可以把问题减少到这个:给定:

我使用这个单独的类创建了一个.net标准1.5客户端库vs 2017

public class Class1 { public List Get() { return new List() { 1, 2, 3, 4, 5, 65, 6 }; } } 

现在我创建一个新的.net 4.6.2控制台应用程序,它只是调用这个类的方法:

  static void Main(string[] args) { var foo = new Class1(); Console.WriteLine("Done!"); Console.ReadLine(); } 

现在我明白了

System.IO.FileNotFoundException:’文件或程序集’System.Runtime,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a未找到

当我将.net standardlib nuget包添加到.net fx控制台时,它可以工作。 但是那时system.runtime可以通过GAC和nuget参考来实现,这对我来说似乎很难看。

我在这里推出了这个简短的测试解决方案: https : //github.com/Gentlehag/NetStandardSample

我错过了什么?

我添加了一个回购 ,告诉你如何做到这一点。 从README.md:

要求

一般来说,在面向.NET Framework的应用程序中使用面向.NET Standard的库需要应用程序项目包含.NET Standard( NETStandard.Library )的NuGet引用。 这可确保应用程序中包含正确的程序集。

在Visual Studio 2015中,从.NET Framework项目中使用NuGet包的默认方式是通过packages.config 。 我不建议使用此路径,因为这意味着所有程序集都直接注入应用程序项目,这将显着膨胀项目文件。 相反,我建议你使用project.json 。 为此,请执行以下步骤:

  1. 卸载所有软件包(如果您仍在使用packages.config
  2. 删除空的packages.config
  3. 添加带有以下内容的project.json文件:

    json { "dependencies": { "NETStandard.Library": "1.6.0" }, "runtimes": { "win": {} }, "frameworks": { "net462": {} } }

请注意,您通常可以依赖于最新版本的NETStandard.Library包,但是您需要确保将框架名称对象与您的应用程序所针对的.NET Framework版本保持同步,即在您进行定位时。在.NET Framework 4.6.1中,您需要确保使用net461

这感觉很笨拙

是的。 我们计划以两种方式解决这个问题:

  • 我们将在Visual Studio 2017中使用基于MSBuild的解决方案替换project.json 。您仍然需要添加对NETStandard.Library的引用,但您不再需要处理包的表示方式,也不必手动保留目标信息同步。

  • 我们计划更新.NET Framework,以便它的未来版本内置支持.NET Standard,在这种情况下将不再需要引用。

我发现添加NETStandard.Library对我来说不起作用,但是确保在构建时生成绑定重定向就行了。 为此你应该确保你拥有

  true  

在项目文件中的某个位置。 这适用于控制台或Web应用程序。 如果您在运行unit testing时遇到问题,可以使用:

  true true  

GenerateBindingRedirectsOutputType是必需的,因为unit testing包含在默认情况下没有可执行输出的类库中,因此这会强制将任何重定向配置写入构建工件,准备在执行测试时使用。

您可以在此处找到有关问题的更多详细信息: https : //github.com/dotnet/announcements/issues/31