NetStandard和.Net Framework之间的引用

Ayb*_*btu 5 .net c# frameworks .net-framework-version .net-standard

我正在尝试让.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项目中给出以下错误:

错误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(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*NET 7

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

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

请注意,微软正在使用.NET Standard 2.0的一些神奇功能,这不太正确,但总体思路仍然存在.


LxL*_*LxL 6

根据此页面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.csNetStandard12.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之间的关系:.NET Standard如何与.NET平台相关.此处的图表显示了依赖关系 接口层次结构 根据图表,依赖于.NET Standard的库无法看到/使用.NET框架实现.

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