Common Language Runtime 是 Microsoft .NET Framework 的基礎。 您可以將 Common Language Runtime 視為代理程式,以在運行時間管理程式碼,提供記憶體管理、線程管理和遠端等核心服務,同時強制執行嚴格的程式代碼安全性。 事實上,程序代碼管理的概念是 Common Language Runtime 的基本原則。 以 Common Language Runtime 為目標的程式代碼稱為 Managed 程式代碼。 不以 Common Language Runtime 為目標的程式代碼稱為原生碼。
Framework 類別庫是可重複使用類別的完整面向物件集合,可用來根據 ASP.NET 和 Web 服務所提供的最新創新,開發從傳統命令行或圖形使用者介面 (GUI) 應用程式到應用程式的應用程式。
平板電腦受管理程式庫包含一組受管理的物件,可擴充框架,以支援平板電腦上手寫的輸入和輸出,以及與其他電腦進行資料交換。
例外
平板電腦 API 中的受控函式庫物件會封裝 COM 函式庫的實作。 當基礎 COM 連結庫物件或控件傳回錯誤時,Managed API 的 會擲回 Marshal.ThrowExceptionForHR 例外狀況,以提供內部 COM 例外狀況的詳細數據。 如需可能傳回之錯誤的詳細數據,請參閱 COM 連結庫中的 HRESULT 值。
對象比較
針對平板電腦平臺管理連結庫中的所有物件,不會覆寫 Equals,以正確比較兩個相同物件。 管理應用程式開發介面(API)不支援物件相等的比較,無論是透過 Equals 函式或透過 equals (==) 運算子。
系結至最新 Microsoft.Ink.dll
最新的 Microsoft.Ink.dll 組件可以相容取代 Microsoft.Ink.dll 1.0 版和 Microsoft.Ink.15.dll。 在大部分情況下,您不需要對以舊版元件散發的應用程式進行任何變更。 不過,在某些情況下,您必須指示 Common Language Runtime 載入器在所有引用較舊的 DLL 的地方使用較新的動態連結庫 (DLL)。
只有在您的應用程式同時使用一個參考 1.0 或 1.5 版的元件和一個參考更新版本的元件(例如 1.7),並且這些元件可能會交換資料的情況下,您才需要使用下列技術明確綁定到新元件。
指示 Common Language Runtime 載入器使用較新 DLL 的最佳方式,是在應用程式層級重定向組件版本。 您可以在應用程式的組態檔中放置元件繫結資訊,以指定應用程式使用較新版本的元件。 如需在應用層級重新導向元件版本的詳細資訊,請參閱 重新導向元件版本,特別是「在配置檔中指定元件綁定」的部分。
您必須在與可執行檔相同的目錄中建立組態檔。 組態檔的名稱必須與可執行檔相同,後面接著 .config 擴展名。 例如,針對應用程式,MyApp.exe,組態檔必須是 MyApp.exe.config 檔案。 組態檔會使用 bindingRedirect 元素來強制所有舊版對應至最新版本,如下列範例所示:
<bindingRedirect oldVersion="0.0.0.0-1.7.2600.xxxx" newVersion="1.7.2600.xxxx" />
如需組態檔的詳細資訊,包括如何建構組態檔的可延伸標記語言 (XML) 範例,請參閱 bindingRedirect 和 重新導向元件版本。
使用 Microsoft Windows XP 平板電腦版本開發工具包 1.7 和更新版本建立的應用程式,會自動繫結至新版的 Microsoft.Ink 元件。 如需組件繫結的詳細資訊,請參閱 執行階段如何找出組件。
注意
使用應用程式原則系結至更新的元件不適用於使用 Divider 類別或 PenInputPanel 類別的應用程式。 使用這些類別中任一個的應用程式必須繼續使用 Microsoft.Ink.15.dll,或者在參考更新後的組件之後重新編譯。
處理事件
如果任何 Managed 物件事件處理程式內的程式代碼擲回例外狀況,則不會將例外狀況傳遞給使用者。 若要確保傳遞例外狀況,請在事件處理程式中使用 try-catch 區塊來處理 Managed 事件。
管理表單
Form 類別及其基類不會定義完成項。 若要清除表單上的資源,請撰寫一個子類別,以提供終結器(即使用~符號的C#終結器),然後呼叫 Dispose。 若要進行清理,完成項會覆寫 Dispose 方法,然後呼叫基類的 Dispose 方法。 當 Boolean 參數 FALSE時,請勿參考 Dispose 方法中需要 Finalize 方法的其他對象,因為這些物件可能已經完成。 如需釋放資源的詳細資訊,請參閱 完成方法和解構函式。
Forms 和 RecognizerContext
RecognizerContext 事件執行於與窗體所在不同的線程中。 Windows Forms 中的控件系結至特定線程,而且不是安全線程。 因此,您必須使用控制項的其中一個調用方法,將呼叫封送處理至適當的執行緒。 控件上的四種方法是安全線程:Invoke、BeginInvoke、EndInvoke和 CreateGraphics 方法。 對於所有其他方法的呼叫,當從不同線程呼叫時,請使用其中一個調用方法。 如需使用這些方法的詳細資訊,請參閱 從線程操控控件。
等候事件
平板電腦環境是多線程的。 使用 CoWaitForMultipleHandles 函式,而非其他等候方法,允許重新進入的元件物件模型 (COM) 呼叫在應用程式等候特定事件時進入多執行緒公寓模型 (MTA)。
使用墨水筆劃集
從 Ink 物件取得的 Strokes 集合實例不會被垃圾收集。 為了避免記憶體流失,每當您使用其中一個集合時,請使用 “using” 語句,如下所示。
using (Strokes strokes = myInk.Strokes)
{
int i = strokes.Count;
}
處置受管理的物件和控制元件
為了避免記憶體流失,您必須在物件或控件超出範圍之前,對任何附加了事件處理程式的 Tablet PC 物件或控件明確呼叫 Dispose 方法。
若要改善應用程式的效能,請在不再需要下列物件、控件和集合時手動處置。
下列 C# 範例示範使用 Dispose 方法的一些案例。
// A field for a Divider object
private Microsoft.Ink.Divider theDivider;
// A method that creates a Divider object
public void CreateDivider()
{
// Make sure any previous Divider object was disposed of.
if (null != theDivider)
{
theDivider.Dispose();
theDivider = null;
}
// Create the Divider object.
theDivider = new Microsoft.Ink.Divider();
// The remainder of the method
}
// A method that disposes of the Divider object
public void DisposeDivider()
{
// The remainder of the method
// Dispose of the Divider object.
if (null != theDivider)
{
theDivider.Dispose();
theDivider = null;
}
}
// A method that uses a local PenInputPanel object.
public void UsePenInputPanel()
{
// Create the PenInputPanel object.
Microsoft.Ink.PenInputPanel thePenInputPanel =
new Microsoft.Ink.PenInputPanel();
// The remainder of the method
// Dispose of the PenInputPanel object before exiting.
thePenInputPanel.Dispose();
thePenInputPanel = null;
}