NetStandard 和 .Net Framework 之间的引用
Referencing between NetStandard and .Net Framework
我正在尝试让 .Net Framework 和 NetStandard 程序集相互通信(以了解可能发生的情况)。我目前有四个项目,两个 Framework 4.5.2 项目和两个 NetStandard1.2 项目:
Framework452.Library
NetStandard12.CentralLibrary
NetStandard12.BaseLibrary
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(); }
}
}
不,.NET Standard 项目不能引用框架项目。
.NET Standard 项目需要跨平台使用,通过引用程序集来强制依赖 .NET 框架使其成为不可能。
请注意,微软在 .NET Standard 2.0 中的一些神奇之处不太是正确的,但总体思路仍然有效。
根据此页面https://docs.microsoft.com/en-us/dotnet/standard/net-standard#net-platforms-support您应该能够实现您的目的,因为 .NET Standard 1.2 支持 .NET Framework 4.5.1(UPDATE:此声明是并非 100% 正确。请参阅下面的更新部分。)
我尝试在 VS 2017 中设置解决方案并按照您的描述设置引用。这是结果。
这是 NetStandard12.CentralLibrary
中的 Class1.cs
代码编译正常,没有任何错误。
注意:如果 Framework452.Library
使用 .NET Standard 1.2(例如 Winforms、Win32 API 或任何对跨平台没有意义的 Microsoft 专有库)。
我推荐这个关于 .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 的库无法 see/use .NET 框架实现。
发布 .NET Standard 2 时,这可能会发生一些变化,您可以通过 Compatibility Shim 引用 .NET Framework。观看此视频了解更多 in-depth 解释 https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169
我正在尝试让 .Net Framework 和 NetStandard 程序集相互通信(以了解可能发生的情况)。我目前有四个项目,两个 Framework 4.5.2 项目和两个 NetStandard1.2 项目:
Framework452.Library
NetStandard12.CentralLibrary
NetStandard12.BaseLibrary
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(); }
}
}
不,.NET Standard 项目不能引用框架项目。
.NET Standard 项目需要跨平台使用,通过引用程序集来强制依赖 .NET 框架使其成为不可能。
请注意,微软在 .NET Standard 2.0 中的一些神奇之处不太是正确的,但总体思路仍然有效。
根据此页面https://docs.microsoft.com/en-us/dotnet/standard/net-standard#net-platforms-support您应该能够实现您的目的,因为 .NET Standard 1.2 支持 .NET Framework 4.5.1(UPDATE:此声明是并非 100% 正确。请参阅下面的更新部分。)
我尝试在 VS 2017 中设置解决方案并按照您的描述设置引用。这是结果。
这是 NetStandard12.CentralLibrary
Class1.cs
代码编译正常,没有任何错误。
注意:如果 Framework452.Library
使用 .NET Standard 1.2(例如 Winforms、Win32 API 或任何对跨平台没有意义的 Microsoft 专有库)。
我推荐这个关于 .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 2 时,这可能会发生一些变化,您可以通过 Compatibility Shim 引用 .NET Framework。观看此视频了解更多 in-depth 解释 https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169