足球资料库数据/孙祥/nba五佳球/足球直播哪个平台好 - cctv5今日现场直播

首頁 > 知識庫 > 正文

將在.NET Core中被廢止的技術
2016-02-15 17:53:44   來源:Jonathan Allen ,譯者 邵思華   評論:0 點擊:

雖然有一部分現有的 NET應用程序,尤其是基于ASP NET MVC的應用程序將能夠比較簡單地遷移至 NET Core,但另一部分 NET應用在遷移過程中可能會遇到某些問題。有一些問題是顯而易見的,例如從WinForms或WPF應用遷移至Universal Windows Applications(UWP),而另一類些問題則更加微妙,這關系到 NET Framework核心功能中更底層的實現。

雖然有一部分現有的.NET應用程序,尤其是基于ASP.NET MVC的應用程序將能夠比較簡單地遷移至.NET Core,但另一部分.NET應用在遷移過程中可能會遇到某些問題。有一些問題是顯而易見的,例如從WinForms或WPF應用遷移至Universal Windows Applications(UWP),而另一類些問題則更加微妙,這關系到.NET Framework核心功能中更底層的實現。

反射

反射API在.NET Core中產生了很大的變化。正如在WinRT中的應用方式一樣,反射功能被分成一種輕量級的版本以及一種開銷更大的版本。來自微軟的Immo Landwerth寫道:

在推出.NET Native時,我們利用了一種技術,它允許我們將應用與框架和第三方依賴進行靜態鏈接。要使這種鏈接功能可行,它必須能夠找出在你的應用沒有使用的那部分框架功能。對于其他技術,例如C++來說,這一過程并不復雜,因為這種系統并不具備反射這樣的動態能力。當然,在.NET Native中仍然支持反射,但我們希望讓這個平臺盡可能地降低開銷,也就是說不必為你所不需要的特性增加開銷。這一點對于反射來說尤其明顯,因為它對于運行時以及編譯器能夠基于靜態信息進行哪些操作施加了極大的限制。

因此,在理想的情況下,反射應當作為.NET Core中一個可選的組件,你可以選擇在自己的應用中完全放棄使用它。麻煩在于,System.Object在進行Object.GetType()操作時將對反射產生依賴。為了打破這種依賴,我們決定讓System.Type不再展現整個反射類型信息,而僅僅展示類型的名稱。這也意味著在.NET Core中的System.Type不再包括GetMembers()等API,但仍然會暴露Name等API。

通過一個名為GetTypeInfo的擴展方法,可以得到在一般情況下能夠從Type對象中獲取的信息。TypeInfo類所包含的信息沒有原來那么豐富,但微軟最近決定在.NET Core中重新引入一部分反射API,這部分變更是超出原先計劃之外的。

為了使代碼更容易進行移植,.NET 4.5及之后的版本提供了對TypeInfo的某種支持,它與在.NET Core中使用的版本相類似。

App Domain

App Domain在CoreCLR中得以實現,但沒有在.NET Native中實現。由于對App Domain的實現需要大量的運行時特性支持,因此目前還沒有任何對它的支持計劃?!皩τ诖a的隔離,我們建議通過進程或容器實現。而對于程序集的動態加載,我們建議使用新的AssemblyLoadContext類。”

Remoting

現如今,已經很少有開發者還能夠記起Remoting庫的存在,更不要說如何使用它了。即使還有人在使用,他們也一直在抱怨它的性能、高復雜性以及總體表現的脆弱性。

如今,多個.NET應用在同一臺機器上的通信基本都被WCF所取代,后者能夠帶來更好的性能,可用于管道或內存映射文件。對于跨機器的通信,微軟推薦“使用一種低開銷的純文本協議,例如HTTP”。因此,微軟并沒有在.NET Core中支持Remoting的計劃。

序列化

.NET Core將支持大多數序列化器,例如數據契約序列化、XML序列化JSON.NET以及protobuf-net。而一個被排除在外的重要角色是二進制序列化。

通過這十年來的經驗,我們終于了解到序列化是一項非常復雜的任務,支持序列化的類型在兼容性方面要面對沉重的負擔。因此,我們已經決定讓序列化成為一種協議,它將在可用的公開API的基礎上實現。然而,二進制序列化的實現需要對類型本身的深入了解,因為這種方式可以對整個對象圖進行序列化,甚至包括私有的狀態信息。

沙箱

從理論上說,沙箱是一種優秀的思想,它允許部分信任代碼以安全的方式執行。但在實踐中,要想正確地應用它非常困難,哪怕是一點點微小的錯誤,也會導致安全性方面的漏洞。Immo Landwerth還表示,它“使實現變得更加困難,并且經常會給未使用沙箱的應用的性能帶來負面影響?!?/p>

推薦的替代方案是使用獨立的進程,通過一個具有有限權限的用戶帳號運行這些進程。通過這種方式,運行時不必重復進行一些開銷較大的權限檢查工作,因為操作系統已經為你完成了這方面的任務。

其他組件

微軟正考慮將下表中列舉的組件進行開源,并移植到.NET Core。

  • System.Data。雖然它的基礎層功能,即提供者模型與SQL client 已經成為了.NET Core的一部分,但某些特性目前仍不可用,例如對于schema、DataTable和DataSet的支持。
  • System.DirectoryServices。.NET Core目前并不支持通過該組件與LDAP或活動目錄進行通信。
  • System.Drawing。雖然從嚴格意義上來說,它應該屬于一種客戶端API,但還是有大量開發者在服務端通過繪圖API實現縮略圖或水印的生成。我們目前還不支持在.NET Core中使用這些API。
  • System.Transactions。雖然ADO.NET支持事務,但并不包括對于分布式事務的支持,后者包括氛圍事務(ambient transaction)及資源征集(enlistment)的概念。
  • System.Xml.Xsl與System.Xml.Schema。.NET Core支持XmlDocument以及由Linq引入的XDocument,包括XPath在內。不過,目前還不支持XSD(XmlSchema)及XSLT(XslTransform)。
  • System.Net.Mail。目前還不支持在.NET Core中通過這些API實現電子郵件的發送。
  • System.IO.Ports。.NET Core目前還不支持與串行化端口的通信。
  • System.Workflow。Windows Workflow Foundation(WF)目前在.NET Core中尚不可用。
  • System.Xaml。在開發UWP應用時,開發者將使用WinRT XAML API。因此,.NET Core目前并不支持托管XAML框架,后者包括解析XAML、并實例化描述對象圖的功能。

你是否有興趣幫助我們移植某個組件?.NET Framework實現的部分源代碼已經通過MIT許可進行了開源,作為Reference Source的一部分。我們正在設法讓社區能夠對我們的移植工作提供支持。如果你愿意參與這一項目,請發送郵件至immol@microsoft.com。

查看英文原文:Discontinued Technology in .NET Core

相關熱詞搜索:Core Discontinued 語言 & 開發 NET 微軟

上一篇:SQL Server 2016將支持R編程語言
下一篇:ZeroTurnaround創始人Jevgeni Kabanov及項目經理Sten Suitsev談JRebel for Android

分享到: 收藏