我正在尝试让.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
项目中产生以下错误:
错误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(); }
}
}
答案 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中设置解决方案并按照您的描述设置参考。结果如下。
这是Class1.cs
NetStandard12.CentralLibrary
代码编译正常,没有任何错误。
注意:如果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。 此处的图表显示了依赖关系 根据图表,依赖.NET Standard的库无法看到/使用.NET框架实现。
当.NET Standard 2发布时,这可能会有所改变,您可以通过Compatibility Shim引用.NET Framework。有关更深入的解释,请参阅此视频https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169