共用方式為


使用受控程式庫

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 中的控件系結至特定線程,而且不是安全線程。 因此,您必須使用控制項的其中一個調用方法,將呼叫封送處理至適當的執行緒。 控件上的四種方法是安全線程:InvokeBeginInvokeEndInvokeCreateGraphics 方法。 對於所有其他方法的呼叫,當從不同線程呼叫時,請使用其中一個調用方法。 如需使用這些方法的詳細資訊,請參閱 從線程操控控件

等候事件

平板電腦環境是多線程的。 使用 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;
}