c# - NetStandard 和 .Net Framework 之间的引用

标签 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

引用结构是:

  • 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 项目出现以下错误:

Error CS0006: Metadata file '~\TryNETStandard\NetStandard12.CentralLibrary\bin\Debug\netstandard1.2\NetStandard12.CentralLibrary.dll' could not be found.

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(); }
    }
}

最佳答案

根据本页https://learn.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

这是 NetStandard12.CentralLibrary 中的 Class1.cs

Class1.cs

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

注意:如果 Framework452.Library 使用 .NET Standard 1.2 不支持的 API(例如 Winforms、Win32 API 或任何 Microsoft 专有的 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 . 这里的图表显示了依赖关系 Interface Hierarchy 根据该图,依赖于 .NET Standard 的库无法查看/使用 .NET Framework 实现。

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

关于c# - NetStandard 和 .Net Framework 之间的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45291737/

相关文章:

c# - 如果 body 撞得太快,区域限制会破坏我的物理模拟

android - 集成自定义解码器在android上播放同时显示fps

javascript - 在JavaScript中创建自定义UI框架的最佳做法

c# - 生成 C# 解决方案模板

.net - ImmutableObjectAttribute 是如何使用的?

c# - 为什么 Dispose() 应该是非虚拟的?

cocoa - 在项目中包含自定义框架时出现问题

c# - wsHttpBinding 与用户名密码

c# - asp.net如何获取上个月的日期

c# - 对 DAL 对象的 TPL 异步调用打开 DataReader 错误