2017-07-24 81 views
3

我試圖讓.Net Framework和NetStandard程序集彼此進行通信(瞭解什麼是可能的)。我目前有四個項目,兩項框架4.5.2項目和2個NetStandard1.2項目:NetStandard和.Net框架之間的引用

  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軟件包時也不起作用。

Can NetStandard項目可以引用框架項目嗎?如果是這樣,我需要做些什麼才能讓他們溝通?目前我可以添加引用,但代碼不可見。

更新

我重新的水溶液,並添加下面的代碼,當我嘗試編譯從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(); } 
    } 
} 

回答

2

根據這一頁https://docs.microsoft.com/en-us/dotnet/standard/net-standard#net-platforms-support,你應該能夠達到你的目的,因爲.NET 1.2標準支持的.NET Framework 4.5.1(UPDATE:這個說法是不是100%正確,請參見下面的更新部分)

我試圖在VS 2017中設置一個解決方案,並按照您所描述的設置參考。結果如下。

Solution Explorer

,這是Class1.csNetStandard12.CentralLibrary

Class1.cs

代碼編譯罰款沒有任何錯誤。

注意:如果Framework452.Library使用未通過.NET 1.2標準(如的WinForms,Win32 API的或任何微軟專利庫,不會使跨平臺的意義上)支持的API代碼可能會失敗。

我建議在.NET標準出臺此YouTube播放清單的MSFT https://www.youtube.com/watch?v=YI4MurjfMn8&list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY

一個在.NET Standard - Checking Compatibilty,他推薦的工具來幫助你找出什麼API是不是在.NET標準的支持。

事將與.NET 2.0標準和「COMPAT墊片」

UPDATE變得更加容易:

與問題提供更多的數據再次嘗試後,這是真的,一個庫定位(取決於) .NET標準不能依賴於面向.NET Framework的庫。出於某種奇怪的原因,編譯器允許我編譯上面給出的示例。這可能是工具中的一個錯誤。

經過多一點研究,我發現了一個很好的例子,演示了NetStandard和NetFramework之間的關係:How .NET Standard relates to .NET Platform。 此處的圖表顯示依賴關係 Interface Hierarchy 根據圖表,依賴於.NET Standard的庫無法看到/使用.NET框架實現。

當.NET Standard 2發佈時,這可能會有所改變,您可以通過Compatibility Shim來引用.NET Framework。看到這個視頻更深入的解釋https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169

+0

我的設置是這樣的,我所做的一切都是'CentralLibrary'調用靜態方法,將從'BaseLibrary'返回'bool'和' Library'。然後在'Tests'中測試這些'bool's。稍後我會再談一次。 – Ayb4btu

+0

您使用VS 2017嗎?對於VS 2017,我不認爲你需要爲netstandard引用Nuget元軟件包。 VS 2017工具集應該以.csproj格式解析新項目文件,並自動爲您執行'dotnet restore'。 – LxL

+0

這裏是我的NetStandard12.CentralLibrary 的csproj <項目SDK = 「Microsoft.NET.Sdk」> <的PropertyGroup> netstandard1.2 LxL

3

沒有,.NET標準項目不能引用框架項目。

.NET標準項目需要跨平臺使用,通過引用針對它的程序集來強制依賴於.NET框架,這使得這是不可能的。

注意,一些神奇的微軟與.NET 2.0標準這樣做是真實的,但整體思路仍然有效。