使用 Managed 程式庫
Common Language Runtime 是 Microsoft .NET Framework的基礎。 您可以將 Common Language Runtime 視為在運行時間管理程式碼的代理程式,提供記憶體管理、執行緒管理和遠端等核心服務,同時強制執行嚴格的程式碼安全。 事實上,程式碼管理的概念是 Common Language Runtime 的基本準則。 以 Common Language Runtime 為目標的程式碼稱為 Managed 程式碼。 未以 Common Language Runtime 為目標的程式碼稱為機器碼。
Framework 類別庫是可重複使用之類別的全方位物件導向集合,可讓您用來開發應用程式,範圍從傳統命令列或圖形化使用者介面 (GUI) 應用程式,以根據 ASP.NET 和 Web 服務所提供的最新創新來開發應用程式。
平板電腦受管理程式庫包含一組 Managed 物件,可擴充架構,以支援平板電腦上手寫的輸入和輸出,以及與其他電腦進行資料交換。
例外狀況
平板電腦 API 中的 Managed 程式庫物件會包裝 COM 程式庫實作。 當基礎 COM 程式庫物件或控制項傳回錯誤時,Managed API 會擲回 Marshal.ThrowExceptionForHR 例外狀況,以提供內部 COM 例外狀況的詳細資料。 如需可能傳回之錯誤的詳細資料,請參閱 COM 程式庫參考中的 HRESULT 值。
物件比較
對於平板電腦平臺管理程式庫中的所有物件,不會覆寫 Equals 以正確比較兩個相同物件。 Managed 應用程式開發介面 (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" />
如需組態檔的詳細資訊,包括如何為組態檔建構 Extensible Markup Language (XML) 的範例,請參閱 bindingRedirect 和 Redirecting Assembly Versions。
使用 Microsoft Windows XP Tablet PC Edition Development Kit 1.7 和更新版本建立的應用程式會自動系結至新版本的 Microsoft.Ink 元件。 如需元件系結的詳細資訊,請參閱 執行時間如何找出元件。
注意
使用應用程式原則系結至更新的元件不適用於使用 Divider 類別或 PenInputPanel 類別的應用程式。 使用這些類別之一的應用程式必須繼續使用Microsoft.Ink.15.dll,或在參考更新的元件之後重新編譯。
使用事件
如果任何 Managed 物件事件處理常式內的程式碼擲回例外狀況,則例外狀況不會傳遞給使用者。 若要確保傳遞例外狀況,請在事件處理常式中使用 try-catch 區塊來處理 Managed 事件。
管理表單
Form類別及其基類不會定義完成項。 若要清除表單上的資源,請撰寫子類別,以提供完成項 (例如,使用呼叫 Dispose的 ~) 解構函式。 若要進行清除,完成項會覆寫 Dispose,然後呼叫基類 Dispose。 當 Boolean 參數為FALSE時,請勿參考 Dispose 方法中需要Finalize方法的其他物件,因為這些物件可能已經完成。 如需釋放資源的詳細資訊,請參閱 Finalize Methods and Destructors。
Forms 和 RecognizerCoNtext
RecognizerCoNtext 事件會在與表單所在的執行緒不同的執行緒中執行。 Windows Forms中的控制項會系結至特定執行緒,而且不是安全線程。 因此,您必須使用其中一個控制項的叫用方法來封送處理對適當執行緒的呼叫。 控制項上的四種方法是安全線程: Invoke、 BeginInvoke、 EndInvoke和 CreateGraphics 方法。 針對所有其他方法呼叫,從不同的執行緒呼叫時,請使用其中一個叫用方法。 如需使用這些方法的詳細資訊,請參閱 從執行緒操作控制項。
等候事件
平板電腦環境已多執行緒。 使用 CoWaitForMultipleHandles 函式,而不是其他等候方法,以允許重新進入元件物件模型 (COM) 呼叫,以在應用程式等候事件時輸入多執行緒 Apartment (MTA) 。
使用筆跡筆劃集合
從Ink物件取得的Strokes集合實例不會進行垃圾收集。 為了避免記憶體流失,每當您使用其中一個集合時,請使用 「using」 語句,如下所示。
using (Strokes strokes = myInk.Strokes)
{
int i = strokes.Count;
}
處置 Managed 物件和控制項
若要避免記憶體流失,您必須在物件或控制項超出範圍之前,明確呼叫任何 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;
}