Share via


マネージド ライブラリの使用

共通言語ランタイムは、Microsoft .NET Frameworkの基盤です。 共通言語ランタイムは、実行時にコードを管理し、メモリ管理、スレッド管理、リモート処理などのコア サービスを提供し、厳格なコード安全性を適用するエージェントと考えることができます。 実際、コード管理の概念は、共通言語ランタイムの基本的な原則です。 共通言語ランタイムを対象とするコードは、マネージド コードと呼ばれます。 共通言語ランタイムを対象としないコードは、ネイティブ コードと呼ばれます。

フレームワーク クラス ライブラリは、従来のコマンド ラインまたはグラフィカル ユーザー インターフェイス (GUI) アプリケーションから、ASP.NET および Web サービスによって提供される最新のイノベーションに基づくアプリケーションまで、アプリケーションの開発に使用できる、再利用可能なクラスの包括的なオブジェクト指向コレクションです。

Tablet PC Managed Library には、Framework を拡張して、タブレット PC での手書きの入力と出力、および他のコンピューターとのデータ交換をサポートする一連のマネージド オブジェクトが含まれています。

例外

Tablet PC API のマネージド ライブラリ オブジェクトは、COM ライブラリの実装をラップします。 基になる COM ライブラリ オブジェクトまたはコントロールがエラーを返すと、マネージド API の は、内部 COM 例外の詳細を提供する Marshal.ThrowExceptionForHR 例外をスローします。 返される可能性のあるエラーの詳細については、「COM ライブラリ リファレンス」の HRESULT 値を参照してください。

オブジェクトの比較

Tablet PC Platform Managed ライブラリ内のすべてのオブジェクトについて、 Equals は同じ 2 つのオブジェクトを正しく比較するためにオーバーライドされません。 マネージド アプリケーション プログラミング インターフェイス (API) では、 Equals 関数または equals (==) 演算子を使用したオブジェクトの等価比較はサポートされていません。

最新のMicrosoft.Ink.dllへのバインド

最新のMicrosoft.Ink.dll アセンブリは、バージョン 1.0 とMicrosoft.Ink.15.dllMicrosoft.Ink.dll互換性のある置き換えです。 ほとんどの場合、古いアセンブリと共に配布されるアプリケーションに変更を加える必要はありません。 ただし、場合によっては、古い DLL が参照されている場所で新しいダイナミック リンク ライブラリ (DLL) を使用するように共通言語ランタイム ローダーに指示する必要があります。

次の手法を使用して新しいアセンブリに明示的にバインドする必要があるのは、アプリケーションでバージョン 1.0 または 1.5 アセンブリを参照するコンポーネントと、1.7 などの新しいバージョン アセンブリを参照するコンポーネントを組み合わせて使用し、それらのコンポーネントがデータを交換する場合だけです。

新しい DLL を使用するように共通言語ランタイム ローダーに指示する最善の方法は、アプリケーション レベルでアセンブリ バージョンをリダイレクトすることです。 アプリケーションの構成ファイルにアセンブリ バインド情報を配置することで、アプリケーションで新しいバージョンのアセンブリを使用することを指定できます。 アプリケーション レベルでのアセンブリ バージョンのリダイレクトの詳細については、「 アセンブリ バージョンのリダイレクト」を参照してください。具体的には、「構成ファイルでのアセンブリ バインドの指定」を参照してください。

実行可能ファイルと同じディレクトリに構成ファイルを作成する必要があります。 構成ファイルの名前は実行可能ファイルと同じで、その後に.configファイル拡張子が続く必要があります。 たとえば、アプリケーションの場合、MyApp.exe、構成ファイルは MyApp.exe.config ファイルである必要があります。 次の例に示すように、構成ファイルでは bindingRedirect 要素を使用して、以前のすべてのバージョンを最新バージョンに強制的にマップします。

<bindingRedirect oldVersion="0.0.0.0-1.7.2600.xxxx" newVersion="1.7.2600.xxxx" />

構成ファイルの拡張マークアップ言語 (XML) を構築する方法の例など、構成ファイルの詳細については、「 bindingRedirectRedirecting Assembly Versions の両方」を参照してください。

Microsoft Windows XP Tablet PC Edition Development Kit 1.7 以降のバージョンで作成されたアプリケーションは、Microsoft.Ink アセンブリの新しいバージョンに自動的にバインドされます。 アセンブリ バインドの詳細については、「 ランタイムがアセンブリを検索する方法」を参照してください。

Note

更新されたアセンブリへのバインドにアプリケーション ポリシーを使用しても、 Divider クラスまたは PenInputPanel クラスを使用するアプリケーションでは機能しません。 これらのクラスのいずれかを使用するアプリケーションは、Microsoft.Ink.15.dllを引き続き使用するか、更新されたアセンブリを参照した後に再コンパイルする必要があります。

 

イベントの操作

マネージド オブジェクトのイベント ハンドラー内のコードが例外をスローした場合、例外はユーザーに配信されません。 例外が確実に配信されるようにするには、マネージド イベントのイベント ハンドラーで try-catch ブロックを使用します。

フォームの管理

Form クラスとその基底クラスでは、ファイナライザーは定義されません。 フォームでリソースをクリーンするには、Dispose を呼び出すファイナライザー (~を使用する C# デストラクターなど) を提供するサブクラスを記述します。 クリーンアップを行うには、ファイナライザーによって Dispose がオーバーライドされ、基底クラス Dispose が呼び出されます。 ブール値パラメーターが FALSE の場合、Dispose メソッドの Finalize メソッドを必要とする他のオブジェクトは参照しないでください。これらのオブジェクトは既に最終処理されている可能性があるためです。 リソースの解放の詳細については、「 Finalize Methods and デストラクター」を参照してください。

フォームと RecognizerContext

RecognizerContext イベントは、フォームが存在するスレッドとは異なるスレッドで実行されます。 Windows フォーム内のコントロールは特定のスレッドにバインドされ、スレッド セーフではありません。 したがって、コントロールの呼び出しメソッドのいずれかを使用して、適切なスレッドへの呼び出しをマーシャリングする必要があります。 コントロールの 4 つのメソッドは、スレッド セーフです。 InvokeBeginInvokeEndInvokeCreateGraphics の各メソッドです。 他のすべてのメソッド呼び出しでは、別のスレッドから を呼び出すときに、これらの呼び出しメソッドのいずれかを使用します。 これらのメソッドの使用方法の詳細については、「 スレッドからのコントロールの操作」を参照してください。

イベントの待機中

タブレット PC 環境はマルチスレッドです。 他の待機メソッドの代わりに 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;
}