NetStandard 和 .Net Framework 之间的引用

问题描述 投票:0回答:3

我正在尝试让 .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 in\Debug etstandard1.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
3个回答
13
投票

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

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

请注意,尽管 Microsoft 在 .NET Standard 2.0 上实现了一些神奇的功能,但这种说法“不太正确”,但总体想法仍然成立。


12
投票
https://learn.microsoft.com/en-us/dotnet/standard/net-standard#net-platforms-support

您应该能够实现您的目的,因为.NET Standard 1.2支持.NET框架 4.5.1(更新:此声明并非 100% 正确。请参阅下面的更新部分。) 我尝试在 VS 2017 中设置解决方案并按照您的描述设置引用。这是结果。

这是

Class1.cs

 中的 
NetStandard12.CentralLibrary

代码编译良好,没有任何错误。

注意

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


我推荐 MSFT 之一关于 .NET 标准介绍的 YouTube 播放列表

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 之间的关系:

.NET Standard 与 .NET Platform 的关系如何

。 这里的图表显示了依赖关系 根据该图,依赖于 .NET Standard 的库无法查看/使用 .NET 框架实现。 当 .NET Standard 2 发布时,这可能会发生一些变化,您可以通过兼容性 Shim 引用 .NET Framework。请观看此视频以获取更深入的解释

https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169


0
投票
来自微软

从.NET Standard 2.0开始,引入了.NET Framework兼容模式。此兼容模式允许 .NET Standard 项目引用 .NET Framework 库,就像它们是为 .NET Standard 编译的一样。引用 .NET Framework 库并不适用于所有项目,例如使用 Windows Presentation Foundation (WPF) API 的库。

有关更多信息,请参阅

.NET Framework 兼容模式。

© www.soinside.com 2019 - 2024. All rights reserved.