NetStandard和.Net Framework之间的引用

时间:2017-07-24 23:46:49

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

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

  1. Framework452.Library
  2. NetStandard12.CentralLibrary
  3. NetStandard12.BaseLibrary
  4. Framework452.Tests
  5. 引用结构是:

    • Framework452.Tests引用NetStandard12.CentralLibrary:将NetStandard.Library nuget包添加到Framework452.Tests
    • NetStandard12.CentralLibrary引用NetStandard12.BaseLibrary:无需修改即可使用。
    • NetStandard12.CentralLibrary引用Framework452.Library:无效,即使Framework452.Library安装了NetStandard.Library nuget软件包。

    NetStandard项目可以参考Framework项目吗?如果是这样,我需要做些什么才能让他们进行沟通?目前我可以添加引用,但代码不可见。

    更新

    我重新创建了解决方案并添加了下面的代码,当我尝试编译时,它会从Framework452.Tests项目中产生以下错误:

      

    错误CS0006:元数据文件   '〜\ TryNETStandard \ NetStandard12.CentralLibrary \ BIN \调试\ 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(); }
        }
    }
    

2 个答案:

答案 0 :(得分:7)

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

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

请注意,微软正在使用.NET Standard 2.0的一些神奇功能, less 是真的,但总的想法仍然存在。

答案 1 :(得分:5)

根据此页面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中设置解决方案并按照您的描述设置参考。结果如下。

Solution Explorer

这是Class1.cs

中的NetStandard12.CentralLibrary

Class1.cs

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

注意:如果Framework452.Library使用.NET Standard 1.2不支持的API(例如Winforms,Win32 API或任何不支持的Microsoft专有库),您的代码可能会失败跨平台感。)

我建议使用MSFT https://www.youtube.com/watch?v=YI4MurjfMn8&list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY

之一的.NET标准介绍中的这个youtube播放列表

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

使用.NET Standard 2.0和' compat shim'

,事情会变得更容易

<强>更新

在使用问题提供的更多数据再次尝试之后,目标(依赖).NET Standard的库不能依赖于以.NET Framework为目标的库。由于一些奇怪的原因,编译器允许我编译我上面给出的示例。这可能是工具中的一个错误。

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

当.NET Standard 2发布时,这可能会有所改变,您可以通过Compatibility Shim引用.NET Framework。有关更深入的解释,请参阅此视频https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169