Freigeben über


Verwenden der verwalteten Bibliothek

Die Common Language Runtime ist die Grundlage des Microsoft-.NET Framework. Sie können sich die Common Language Runtime als einen Agent vorstellen, der Code zur Ausführungszeit verwaltet, Kerndienste wie Speicherverwaltung, Threadverwaltung und Remoting bereitstellt und gleichzeitig strenge Codesicherheit erzwingt. Tatsächlich ist das Konzept der Codeverwaltung ein grundlegendes Prinzip der Common Language Runtime. Code, der auf die Common Language Runtime abzielt, wird als verwalteter Code bezeichnet. Code, der nicht auf die Common Language Runtime ausgerichtet ist, wird als nativer Code bezeichnet.

Die Framework-Klassenbibliothek ist eine umfassende, objektorientierte Sammlung wiederverwendbarer Klassen, die Sie verwenden können, um Anwendungen zu entwickeln, die von herkömmlichen Befehlszeilen- oder grafischen Benutzeroberflächenanwendungen (GUI) bis hin zu Anwendungen reichen, die auf den neuesten Innovationen von ASP.NET und Webdiensten basieren.

Die verwaltete Tablet PC-Bibliothek enthält eine Reihe verwalteter Objekte, die das Framework erweitern, um die Eingabe und Ausgabe von Handschriften auf Tablet-PCs sowie den Datenaustausch mit anderen Computern zu unterstützen.

Ausnahmen

Die verwalteten Bibliotheksobjekte in der Tablet PC-API umschließen die COM-Bibliotheksimplementierungen. Wenn das zugrunde liegende COM-Bibliotheksobjekt oder -Steuerelement einen Fehler zurückgibt, löst die verwaltete API eine Marshal.ThrowExceptionForHR-Ausnahme aus, die die Details zur inneren COM-Ausnahme bereitstellt. Ausführliche Informationen zu möglichen Fehlern, die zurückgegeben werden können, finden Sie unter den HRESULT-Werten in der COM-Bibliotheksreferenz.

Objektvergleich

Für alle Objekte in der verwalteten Tablet-PC-Plattformbibliothek wird Equals nicht überschrieben , um zwei identische Objekte ordnungsgemäß zu vergleichen. Die verwaltete Anwendungsprogrammierschnittstelle (API) unterstützt den Vergleich von Objekten auf Gleichheit nicht, weder über die Equals-Funktion noch über den Gleichheitsoperator (==).

Bindung an die neueste Microsoft.Ink.dll

Die neueste Microsoft.Ink.dll assembly ist ein kompatibler Ersatz für Microsoft.Ink.dll Version 1.0 und Microsoft.Ink.15.dll. In den meisten Fällen müssen Sie keine Änderungen an Ihren Anwendungen vornehmen, die mit den älteren Assemblys verteilt werden. In einigen Fällen müssen Sie jedoch den Common Language Runtime-Ladeprogramm anweisen, die neuere DLL (Dynamic Link Library) überall dort zu verwenden, wo auf die älteren DLLs verwiesen wurde.

Das einzige Mal, dass Sie explizit mit der folgenden Methode an die neue Assembly binden müssen, ist, wenn Ihre Anwendung eine Komponente verwendet, die auf die Assembly der Version 1.0 oder 1.5 in Kombination mit einer Komponente verweist, die auf eine neuere Versionsassembly verweist, z. B. 1.7, und wenn diese Komponenten Möglicherweise Daten austauschen.

Die beste Möglichkeit, den Common Language Runtime-Ladeprogramm zur Verwendung der neueren DLL anzuweisen, besteht darin, Assemblyversionen auf Anwendungsebene umzuleiten. Sie können angeben, dass Ihre Anwendung die neuere Version der Assembly verwendet, indem Sie Assemblybindungsinformationen in die Konfigurationsdatei Ihrer Anwendung einfügen. Weitere Informationen zum Umleiten von Assemblyversionen auf Anwendungsebene finden Sie unter Umleiten von Assemblyversionen, insbesondere im Abschnitt "Angeben der Assemblybindung in Konfigurationsdateien".

Sie müssen eine Konfigurationsdatei im selben Verzeichnis wie Ihre ausführbare Datei erstellen. Die Konfigurationsdatei muss den gleichen Namen wie Ihre ausführbare Datei haben, gefolgt von der dateierweiterung .config. Beispielsweise muss die Konfigurationsdatei für eine Anwendung MyApp.exe die MyApp.exe.config-Datei sein. Die Konfigurationsdatei verwendet ein bindingRedirect-Element , um zu erzwingen, dass alle früheren Versionen der neuesten Version zugeordnet werden, wie im folgenden Beispiel gezeigt:

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

Weitere Informationen zu Konfigurationsdateien, einschließlich Beispielen zum Erstellen der EXTensible Markup Language (XML) für die Konfigurationsdatei, finden Sie unter bindingRedirect und Redirecting Assembly Versions.

Anwendungen, die mit Microsoft Windows XP Tablet PC Edition Development Kit 1.7 und höheren Versionen erstellt wurden, werden automatisch an die neue Version der Microsoft.Ink-Assembly gebunden. Weitere Informationen zur Assemblybindung finden Sie unter How the Runtime Locates Assemblies.

Hinweis

Die Verwendung von Anwendungsrichtlinien zum Binden an die aktualisierte Assembly funktioniert nicht für Anwendungen, die die Divider-Klasse oder die PenInputPanel-Klasse verwenden. Anwendungen, die eine dieser Klassen verwenden, müssen entweder weiterhin Microsoft.Ink.15.dll verwenden oder nach dem Verweisen auf die aktualisierte Assembly neu kompiliert werden.

 

Arbeiten mit Ereignissen

Wenn der Code in einem Ereignishandler für eines der verwalteten Objekte eine Ausnahme auslöst, wird die Ausnahme nicht an den Benutzer übermittelt. Um sicherzustellen, dass Ausnahmen übermittelt werden, verwenden Sie try-catch-Blöcke in Ihren Ereignishandlern für verwaltete Ereignisse.

Verwalten von Formularen

Die Form-Klasse und ihre Basisklassen definieren keinen Finalizer. Um Ihre Ressourcen auf einem Formular zu sauber, schreiben Sie eine Unterklasse, die einen Finalizer (z. B. den C#-Destruktor mit ~) bereitstellt, der Dispose aufruft. Um die Bereinigung durchzuführen, überschreibt der Finalizer Dispose und ruft dann die Basisklasse Dispose auf. Verweisen Sie nicht auf andere Objekte, die die Finalize-Methode in der Dispose-Methode erfordern, wenn der boolesche Parameter FALSE ist, da diese Objekte möglicherweise bereits abgeschlossen wurden. Weitere Informationen zum Freigeben von Ressourcen finden Sie unter Fertigstellen von Methoden und Destruktoren.

Formulare und recognizerContext

RecognizerContext-Ereignisse werden in einem anderen Thread als dem Thread ausgeführt, in dem sich das Formular befindet. Steuerelemente in Windows Forms sind an einen bestimmten Thread gebunden und nicht threadsicher. Daher müssen Sie eine der Aufrufmethoden des Steuerelements verwenden, um den Aufruf an den richtigen Thread zu marshallen. Vier Methoden für ein Steuerelement sind threadsicher: die Methoden Invoke, BeginInvoke, EndInvoke und CreateGraphics . Verwenden Sie für alle anderen Methodenaufrufe eine dieser Aufrufmethoden, wenn Sie aus einem anderen Thread aufrufen. Weitere Informationen zur Verwendung dieser Methoden finden Sie unter Bearbeiten von Steuerelementen aus Threads.

Warten auf Ereignisse

Die Tablet-PC-Umgebung ist multithreaded. Verwenden Sie die CoWaitForMultipleHandles-Funktion anstelle anderer Wartemethoden, um erneuten COM-Aufrufen (Component Object Model) den Zugriff auf Ihr Multithread-Apartment (MTA) zu ermöglichen, während Ihre Anwendung auf ein Ereignis wartet.

Verwenden von Freihandstrichsammlungen

Instanzen von Strokes-Auflistungen , die aus einem Ink-Objekt abgerufen werden, werden nicht mit Garbage Collection erfasst. Um einen Speicherverlust zu vermeiden, verwenden Sie bei jeder Arbeit mit einer dieser Auflistungen die Anweisung "using", wie unten gezeigt.

using (Strokes strokes = myInk.Strokes)
{
    int i = strokes.Count;
}

Löschen verwalteter Objekte und Steuerelemente

Um einen Speicherverlust zu vermeiden, müssen Sie explizit die Dispose-Methode auf jedem Tablet PC-Objekt oder -Steuerelement aufrufen, an das ein Ereignishandler angefügt wurde, bevor das Objekt oder Steuerelement den Gültigkeitsbereich überschreitet.

Um die Leistung Ihrer Anwendung zu verbessern, löschen Sie die folgenden Objekte, Steuerelemente und Auflistungen manuell, wenn sie nicht mehr benötigt werden.

Im folgenden C#-Beispiel werden einige Szenarien veranschaulicht, in denen die Dispose-Methode verwendet wird.

// 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;
}