【问题标题】:Referencing between NetStandard and .Net FrameworkNetStandard 和 .Net Framework 之间的引用
【发布时间】:2017-12-30 16:44:27
【问题描述】:

我正在尝试让 .Net Framework 和 NetStandard 程序集相互通信(以了解可能的情况)。我目前有四个项目,两个 Framework 4.5.2 项目和两个 NetStandard1.2 项目:

  1. Framework452.Library
  2. NetStandard12.CentralLibrary
  3. NetStandard12.BaseLibrary
  4. Framework452.Tests

引用结构为:

  • Framework452.Tests 引用 NetStandard12.CentralLibrary:通过将 NetStandard.Library nuget 包添加到 Framework452.Tests 来工作。
  • NetStandard12.CentralLibrary 引用 NetStandard12.BaseLibrary:无需修改即可工作。
  • NetStandard12.CentralLibrary 引用 Framework452.Library:即使 Framework452.Library 安装了 NetStandard.Library nuget 包,也无法正常工作。

NetStandard 项目可以参考框架项目吗?如果是这样,我需要做什么才能让他们交流?目前我可以添加引用,但它对代码不可见。

更新

我重新创建了解决方案并添加了以下代码,当我尝试编译时,Framework452.Tests 项目出现以下错误:

错误 CS0006:元数据文件 '~\TryNETStandard\NetStandard12.CentralLibrary\bin\Debug\netstandard1.2\NetStandard12.CentralLibrary.dll' 找不到。

namespace Framework452.Library
{
    public class Returner452 {
        public static bool ReturnTrue() { return true; }
    }
}


using Xunit;
namespace Framework452.Tests
{
    public class Class1 {
        [Fact]
        public void FrameworkTest() {
            Assert.True(NetStandard12.CentralLibrary.Class1.Return452());
        }

        [Fact]
        public void NetStandardTest() {
            Assert.True(NetStandard12.CentralLibrary.Class1.Return12());
        }
    }
}


namespace NetStandard12.BaseLibrary
{
    public class Returner12 {
        public static bool ReturnTrue() { return true; }
    }
}


using Framework452.Library;
using NetStandard12.BaseLibrary;
namespace NetStandard12.CentralLibrary
{
    public class Class1
    {
        public static bool Return452() { return Returner452.ReturnTrue(); }
        public static bool Return12() { return Returner12.ReturnTrue(); }
    }
}

【问题讨论】:

    标签: c# .net frameworks .net-standard .net-framework-version


    【解决方案1】:

    不,.NET Standard 项目不能引用框架项目。

    .NET Standard 项目需要跨平台使用,通过引用针对它的程序集来强制依赖 .NET 框架,这使得这不可能。

    请注意,微软在 .NET Standard 2.0 中的一些神奇之处较少正确,但总体思路仍然有效。

    【讨论】:

      【解决方案2】:

      根据此页面https://docs.microsoft.com/en-us/dotnet/standard/net-standard#net-platforms-support,您应该能够实现您的目的,因为 .NET Standard 1.2 支持 .NET Framework 4.5.1(更新:此声明并非 100% 正确。请参阅下面的更新部分。)

      我尝试在 VS 2017 中设置解决方案并按照您的描述设置参考。结果如下。

      这是NetStandard12.CentralLibrary中的Class1.cs

      代码编译正常,没有任何错误。

      注意:如果 Framework452.Library 使用 .NET Standard 1.2 不支持的 API(例如 Winforms、Win32 API 或任何对跨平台)。

      我推荐这个 .NET 标准介绍的 youtube 播放列表,来自一位 MSFT https://www.youtube.com/watch?v=YI4MurjfMn8&list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY

      .NET Standard - Checking Compatibilty 中,他推荐了一些工具来帮助您找出 .NET Standard 不支持的 API。

      .NET Standard 2.0 和 'compat shim' 会让事情变得更容易

      更新

      在使用问题提供的更多数据再次尝试后,确实针对(取决于).NET Standard 的库不能依赖于针对 .NET Framework 的库。出于某种奇怪的原因,编译器允许我编译上面给出的示例。这可能是工具中的错误。

      经过一番研究,我找到了一个很好的例子来说明 NetStandard 和 NetFramework 之间的关系:How .NET Standard relates to .NET Platform。 此处的图表显示了依赖关系 根据图表,依赖于 .NET Standard 的库无法看到/使用 .NET 框架实现。

      当 .NET Standard 2 发布时,这可能会发生一些变化,您可以通过 Compatibility Shim 引用 .NET Framework。看这个视频更深入的解释https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169

      【讨论】:

      • 我的设置与此相同,我所做的只是让CentralLibrary 调用静态方法,这些方法将从BaseLibraryLibrary 返回bool。然后在Tests 中测试这些bools。稍后我会再试一次。
      • 你在使用 VS 2017 吗?对于 VS 2017,我认为您不需要为 netstandard 引用 Nuget 元包。 VS 2017 工具集应解析 .csproj 格式的新项目文件并自动为您执行“dotnet restore”。
      • 这是我的 NetStandard12.CentralLibrary 的 csproj netstandard1.2
      • 查看我的更新。在添加上面的代码之前它可以正常编译,但是现在它会抛出一个错误。
      • @Ayb4btu 我错了,请查看我更新的答案以了解更多详情。
      猜你喜欢
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多