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

时间:2017-01-08 17:05:35

标签: c# .net visual-studio-2017 .net-standard .net-standard-1.5

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

我可以将问题减少到这个: 给出:

我使用此单一类创建.net标准1.5客户端库vs 2017;

public class Class1
    {
        public List<int> Get()
        {
            return new List<int>() { 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

我错过了什么?

2 个答案:

答案 0 :(得分:9)

我添加了repo,告诉您如何执行此操作。来自README.md:

  

要求

     

一般来说,在应用程序中使用面向.NET Standard的库   以.NET Framework为目标,要求应用程序项目包含NuGet   .NET Standard(NETStandard.Library)的参考。这确保了正确的   应用程序中包含一组程序集。

     

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

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

         

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

  6.         

    请注意,您通常可以依赖于最新版本   NETStandard.Library包,但您需要确保保留框架   绰号与您的应用程序所针对的.NET Framework版本同步,即   当您定位.NET Framework 4.6.1时,您需要确保使用   而是net461

         

    这感觉很笨拙

         

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

         
        
    • 我们在Visual中使用基于MSBuild的解决方案替换project.json   2017年工作室。您仍然需要添加对NETStandard.Library的引用,但是   你不再需要弄乱包裹的方式也没有   必须手动保持目标信息同步。

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

    •   

答案 1 :(得分:0)

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

<PropertyGroup>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>

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

<PropertyGroup>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

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

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