【问题标题】:Using .net standard 1.5 lib in .net 4.6.2 misses System.Runtime 4.1.0.0在 .net 4.6.2 中使用 .net 标准 1.5 库会错过 System.Runtime 4.1.0.0
【发布时间】:2017-09-28 21:17:35
【问题描述】:

我在 .net framework 4.6.2 控制台应用程序中使用 .net 标准时遇到了一些问题。

我可以将问题简化为: 给定:

我用这个单一的类创建了一个 .net 标准 1.5 客户端库 vis 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,版本=4.1.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a 未找到

当我将 .net standardlib nuget 包添加到 .net fx 控制台时,它可以工作。但是随后 system.runtime 将可以通过 GAC 和通过 nuget 参考来使用,这对我来说似乎很丑陋。

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

我错过了什么?

【问题讨论】:

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


    【解决方案1】:

    我添加了一个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. 删除空的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 中将 project.json 替换为基于 MSBuild 的解决方案 Studio 2017。您仍然需要添加对NETStandard.Library 的引用,但是 您不再需要弄乱包裹的表示方式,也不必 必须手动保持定位信息同步。

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

    【讨论】:

    • 非常感谢他的澄清。我应该如何在 VS2017 RC 中添加包?那里我没有 package.json 了,我不确定依赖部分是否有等效的替代品?
    • 在 VS2017 中,我们已将 project.json 替换为新的 MSBuild 项目组 &lt;PackageReference&gt;。这比project.json 更容易。对于 .NET Framework 应用程序,我们将允许您使用 package.config 或 MSBuild-way 和 AFAIK,计划是在首次使用时提示您。但是,我认为这在当前的 VS2017 RC 中还没有。我会问的。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      相关资源
      最近更新 更多