簡體   English   中英

我應該使用類庫來定位.NET Framework和C#版本?

[英]What .NET Framework and C# version should I target with my class library?

我正在構建一個DLL類庫 - 我希望盡可能多的人使用它。 我應該使用哪個版本的.NET Framework和哪個C#版本? 是否可以為不同版本生成向后兼容的DLL或不同的DLL? 或者Windows是否自動更新.NET框架,所以我應該使用最新版本? 任何指導贊賞!

就個人而言,我的目標是.NET 2.0。 這意味着,除其他外:

  • 沒有擴展方法(雖然有解決方法)
  • 沒有linq

  • 你可以使用lambda表達式

  • 你可以使用'var'關鍵字

問題是,您可以使用C#3.x語言功能(所謂的語法糖),但您不能使用以C#3.x為目標的庫(System.Core為1,包括擴展方法和linq)。

我不會嘗試支持C#1.x,因為它與C#2.x及更高版本完全不同。 此外,我希望大多數使用你的圖書館的人都是建造新東西的人,他們不會在正確的思想中使用C#1.x ;-)

我們針對某些產品同時針對多個運行時版本(.NET 1.1,.NET 2.0和.NET 3.5)。

我們以幾種方式處理這個問題:

  • 單獨的解決方案和項目文件以及.NET 1.1,2.0和3.5 SP1中的每一個,但引用相同的源文件。

例如:

\ProductFoo_1_1.sln (.NET 1.1 solution, VS 2003)
 \ProductFoo_2_0.sln (.NET 2.0 solution, VS 2008)
 \ProductFoo_3_5.sln (.NET 3.5 solution, VS 2008)

 \FooLibrary\FooLibrary_1_1.csproj (.NET 1.1 Project, VS 2003) 
 \FooLibrary\FooLibrary_2_0.csproj (.NET 2.0 Project, VS 2008) 
 \FooLibrary\FooLibrary_3_5.csproj (.NET 3.5 Project, VS 2008) 

 \FooLibrary\FooClass.cs (shared amongst all Projects)
 \FooLibrary\FooHelpers_1_1.cs (only referenced by the .NET 1.1 project)

 \FooService\FooService_3.5.csproj (.NET 3.5 Project, VS 2008)
 \FooService\FooService.cs
  • 在每個解決方案中定義NET_X_X符號

  • 對於.NET Framework特定代碼,我們使用預處理器指令,例如:

public void SomeMethod(int param)
{
#ifdef NET_1_1
 // Need to use Helper to Get Foo under .NET 1.1
  Foo foo = Helper.GetFooByParam(param);
#elseif NET_2_0 || NET_3_5
 // .NET 2.0 and above can use preferred  method. 
  var foo =  new Foo { Prop = param }; 
  foo.LoadByParam();  
#endif 
  foo.Bar();
}

#ifdef NET_3_5
// A method that is only available under .NET 3.5 
public int[] GetWithFilter(Func Filter)
{ 
  // some code here
}
#endif

為了澄清,以#開頭的上述行是預處理器命令。 編譯解決方案時,C#編譯器(csc)預處理源文件。 如果您有#ifdef語句,則csc將評估以確定是否定義了該符號 - 如果是,則在編譯項目時包括該段中的行。

這是一種在某些條件下標記代碼以進行編譯的方法 - 我們還使用它在特定的詳細調試版本中包含更密集的調試信息,如下所示:

#if DEBUG_VERBOSE
  Logging.Log("Web service Called with parameters: param = " + param);
  Logging.Log("Web service Response: " + response); 
  Logging.Log("Current Cache Size (bytes): " + cache.TotalBytes); 
  // etc. 
#endif
  • 然后,我們使用NAnt腳本自動生成每個.NET版本的發行版。 我們碰巧通過TeamCity控制所有這些,但我們也可以手動觸發NAnt腳本。

它確實使事情變得更加復雜,因此我們只傾向於在需要維護舊版.NET 1.1或2.0實例的地方(例如,客戶無法/不會升級)。

我想當.NET 4.0滾動時,我們會做同樣的事情,只需添加一個NET_4_0符號。

除非你需要使用3.0或3.5功能,否則我會保持2.0。

試試這個:

將目標模式切換到框架2.0(刪除System.Core引用)。

如果沒有編譯,請嘗試添加對linqbridge.dll的引用:

如果沒有,那么你應該針對3.5;)

如果我要開始一個新項目,我會一直使用最新的運行時! 如果3.5可用,為什么我需要在2.0或1.0中啟動項目,除非我知道新版本存在嚴重錯誤? 新版本意味着修復舊錯誤並添加新功能,這樣做很好。

在將舊項目升級到新版本時,您需要考慮您的收益和損失。 如果它旋轉,升級它,如果不堅持舊版本。

請小心,因為新工具可能不支持舊版本。 雖然2010年並非如此,因為它將支持高達2.0的所有版本。

我投票支持Erik van Brakel的回答。 另外我想建議如果你想支持LINQ和擴展方法等3.5功能,你可以創建一個額外的庫

MyLibrary.DLL

MyLibrary.LINQ.dll

因此使用與MS相同的方法(當他們離開System.dll 2.0版本但將所有新功能添加到System.Core.dll中時)

我將使用包含核心功能的庫來定位2.0版,並添加一個額外的目標庫3.5,以根據您的核心庫添加一些擴展方法。

從我的角度來看,如果你想要廣泛的用戶,你應該使用早期版本,1.1會很好,因為它可以在任何機器上運行.Net的版本。

這取決於dll的用途。 如果它只是一個你想讓別人可以使用的通用C#邏輯,那么.net 2.0可能是你最好的選擇。 但是,如果它與.net中的較新功能有關,如WPF,EF,WCF,silverlight等,那么它將需要在支持該特定功能的.net版本中。

就個人而言,我會說在.net 3.5中編寫它只是因為從.net2.0到.net3.5的跳轉是非常輕松的,因為與.net1.x到.net2.0的跳轉不同,沒有太多突破性的變化。 :)

我認為不再有人使用.Net 1.1了。 所以除非你真的想要使用3.5功能2.0應該沒問題。 此外,如果您可以控制誰將實際使用您的庫,那么它也取決於它們。 如果他們有最新的框架,那么你可以使用它。

結合使用Will Hughes提到的方法,如果您希望訪問/選項在可用時使用更新的功能,則在活動開發期間,使用最新的框架。 准備好開始發布候選版本時,設置為最低框架,然后當問題到達時,穩定地提升框架版本和/或使用#ifdef方法來解決問題。

這個解決方案效果很好。 我只是設置了兩個不同的項目,每個項目都有一個獨特的“Project Properties-> Build-> Conditional compilation Symbols”,並在代碼中使用如下:

#if NET_4
            xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore; 
#endif
#if NET_3_5
            xmlReaderSettings.ProhibitDtd = false;                
#endif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM