OSP201 多平台類別函式庫開發實戰 黃忠成 技術總監 黃忠成資訊工作室
.NET Platform Windows Phone Silverlight .NET Framework XBox Windows Store Apps
直接交互Reference (.NET Class Library) App .NET Framework App Silverlight ClassLibrary.dll .NET Framework Windows Store Apps App Windows Phone
直接交互Reference (Windows Phone Class Library) App .NET Framework App Silverlight ClassLibrary.dll Silverlight Windows Store Apps App Windows Phone
直接交互Reference (Silverlight Class Library) App .NET Framework App Silverlight ClassLibrary.dll Windows Phone Windows Store Apps App Windows Phone
Share Binary is hard in .NET Platform
How to Share Code 所有.NET Framework Platform都擁有一些相同的類別 ie: WebRequest 但, 也都少掉某些類別 ie: WebClient 透過Conditional Compilation(編譯條件), 可以把同一份Code運用在不同的.NET Framework Platform.
Visual Studio 2010在Share Code的支援 Visual Studio 2010 支援Add As Link模式 可以讓兩個Project共用同一個程式原始檔
所以, 我們看到了很多Open Source Project出現以下的景象
更複雜的景象
Share Code is hard in .NET Platform
Why Share Code is hard 如果只是Namespace不同, Share Code很簡單 加上不同的類別及屬性, 還可以接受 再加上不同的Code Pattern(Sync vs Async),那事情就大條了 結論 選擇透過共享程式碼進行跨平台(Cross .NET Platform)開發, 是相當痛苦的!!
Re-invoke: Share Binary
Re-invoke: Share Binary Write-once, Reference anywhere Silverlight Windows Phone My Library.dll XBox Windows Store Apps
可能嗎? 其實, .NET Framework與.NET Compact Framework曾經出現過以下的景象 MyApplication.exe
這是因為….. .NET Compact Framework是.NET Framework的子集 MyApplication.exe System.Windows.Forms.Form Retargetble System .NET Framework .NET Compact Framework System.Windows.Forms.dll System.Windows.Forms.dll
Share Assemblies 在Visual Studio 2010, 允許程式設計師以Silverlight Class Library方式開發Library, 產出的DLL將可直接使用於Silverlight及.NET Silverlight Application Silverlight Class Library.dll .NET Framework 4 Application
Share Assemblies Demo
但…事情有時沒這麼單純
Portable Library Tools Visual Studio 2010 (with Extension) Visual Studio 2012 Portable Library Tools 的目標 Share Library with Binary
Share Assemblies with Portable Library Windows Phone Silverlight PortableLibrary.dll XBox Windows Store Apps
如何辦到的? 收集所有平台可使用的Namespace,Class 形成另一組.NET Framework subset(metadata only) 借助.NET Framework與.NET Compact Framework時代就留下來的Retargetble(assemblies mapping and class forward)設計 Feature .NET Silverlight Windows Phone Xbox 360 Core BCL Yes Core XML Core HTTP - WCF Client MEF
如何取得 Visual Studio 2012 Visual Studio 2010 內建 透過Extension Manager(擴充管理員)安裝
Migrating Picasa Client To Portable Library Demo
建立Portable Library
Picasa Client for Windows Phone Porting Source code The Project Structure Run & Demo Project 說明 PicasaLib 包含連結至Picasa的API實作程式碼 PicasaClient Windows Phone 程式
Porting Picasa Client Library (Portable With Windows Runtime) WebClient 不存在於 Windows Runtime 使用WebRequest/WebResponse System.Threading.Thread不存在於Windows Runtime 使用ThreadPool Thread.Sleep不存在於Windows Runtime 使用ManualResetEvent.WaitOne Stream.Close 使用Stream.Dispose
Using Picasa Client Portable Library Windows Phone Demo
Using Picasa Client Portable Library Windows Store App Demo
Preparing Writing Portable ViewModel 在MVVM的設計準則下, ViewModel裡面包含許多商業及UI邏輯 可以把ViewModel寫成Portable Library嗎? Portable Library支援MVVM需要的兩個主要類別 ObservableCollection<T> ICommand 必須面臨的挑戰 ObservableCollection的部分操作必須在UI Thread完成 Deployment.Current.Dispatcher.BeginInvoke -> SynchronizationContext.Post ViewModel中需要小量與UI結合的程式碼
Starting Writing Portable ViewModel 守則1-不要嘗試把ViewModel完全改寫為Portable Library 善用繼承來最大化可重用部分 ViewModelBase ViewModel (WindowsPhone) ViewModel (Windows Store Apps)
Using Picasa ViewModel Portable Library Windows Phone Demo
Using Picasa ViewModel Portable Library Windows Store App Demo
Porting WCF Client Creating WCF Service Generate WCF Client Proxy in Portable Libary WCF Proxy (Portable Library) Windows Phone Client Windows Store Apps Client
Using WCF Client Portable Library Windows Phone Demo
Using WCF Client Portable Library Windows Store App Demo
深入Portable Library架構 Portable Library與Non Portable Library的差異 Windows Store Apps .NET Framework 4.5 Portable Library
Portable Library依賴的 關鍵設計-Retargetable 從.NET Compact Framework時代就存在的Retargetable Flags 在Windows Store App中, mscorlib會被retarget 為System.Runtime 在.NET Framework 4.5中, mscorlib會被retarget 為mscorlib 4.0 在Windows Phone中, mscorlib會被retarget為mscorlib 2.0.5.0 Portable Library的Retarget特性, 會讓其所使用的參考在不同的.NET Runtime被重新對應
.NET Framework 4.5與Windows Runtime 另一個關鍵的設計 .class extern forwarder System.Runtime(Windows Store Apps)與mscorlib(.NET Framework 4.5)
深入.NET Framework 4.5與Windows Runtime 在Windows Runtime中, System.Runtime取代了原本mscorlib的地位 但事實上, System.Runtime多數的類別宣告都是.class extern forwarder 這意味著, System.Runtime其實會串連回mscorlib 當使用System.Text.StringBuilder(System.Runtime),就是使用System.Text.StringBuilder(mscorlib) App StringBuilder (System.Runtime) StringBuilder (mscorlib)
另一段Retarget 旅程- ICommand Portable Library(System.Windows.dll) .NET Framework 4.5 (System.ObjectModel.dll) .NET Framework 4.5 (System..dll)
但, 有一個問題 Retargetable的對象是Assembly,class forward的對象是類別 但是….ThreadPool類別並不存在於Windows Store Apps(Windows Runtime)啊?
ThreadPool的秘密 System.Runtime多數的類別都forward回mscorlib ThreadPool宣告於mscorlib(.NET Framework 4.5) 因此, 撰寫Windows Store App時(Managed), mscorlib是隱含式的參考 雖然Windows Store Apps中沒有ThreadPool的設計, 但隱含的mscorlib有, Windows Runtime會直接使用mscrolib中的ThreadPool 簡單的說, Windows Store Apps中只是因為安全性元素,不讓程式設計師使用ThreadPool及部分定義於mscorlib中的類別, 並不是完全不能使用,透過適當的forward定義, 就可使用到這些類別
透過Reflection來證明
要注意的事 Windows Runtime會check可以與不可以呼叫的API 所以上例是無法透過Invoke來喚起File.Exists的, 因為會被擋下來
該把誰變成Portable Library 非UI的邏輯程式碼(Model) 部分UI的邏輯程式碼(View Model Base) 與WCF/REST 溝通的程式碼(WCF Proxy Client)
注意事項 Visual Studio 2010 Portable Library Template已經參考了所有可通用的 Assemblies,不要自行添加其它參考
黑之章-自製Portable Library
講在前頭的話 自製Portable Library無法通過WACK檢測 也就是說無法上架至Windows Store 以下內容純屬研究性質, 目的在於讓大家了解Portable Library與Windows Metadata設計的真實面 要證實我講的是真的, 不是呼巄大家哦 ^_^
必須擁有的知識與工具 得看得懂簡單的IL Code ILASM與ILDASM
開始吧 找到對的Assembly File.IO.Exists定義於mscorlib(.NET Framework 4.5) 找到對的Portable Library(mscorlib) 使用ILDASM找尋對應碼 使用ILDASM反組譯Portable Library(mscorlib) 添加 IL Code 使用ILASM編譯 取代原本的Portable Library(mscorlib)
自製Portable Library Demo
關於COM Object Windows Store Apps不允許存取COM Object 如何解決呢? Windows RT版本不允許自訂COM存在 存取COM Object有一定的風險 如何解決呢? 使用自訂的Portable Library 使用Windows Runtime Component(C++)
注意 必須先知道的事 那還有用嗎? 存取COM Object代表著無法通過WACK檢測 無法上架至Windows Store Windows 8 Enterprise支援LOB應用程式,可不用通過WACK檢測及由Windows Store安裝
開始吧 自訂Portable Library,添加Type.GetTypeFromGuid函式 添加<APPNAME>.manifest 加入引用COM定義 添加COM至Application Package 使用Side-by-Side COM Object 測試
立即啟動!免費開發人員帳戶!! Windows Store / Windows Azure / Windows Phone 擁有 MSDN 訂閱 「取得代碼」後進行註冊 http://aka.ms/startmsdn 優惠內容: Windows Store / Windows Phone – 啟用後12個月, 完全免費! Windows Azure – 訂閱期間, 每月固定的免費使用量!