Udostępnij przez


Korzystanie z biblioteki zarządzanej

Środowisko uruchomieniowe języka wspólnego jest podstawą programu Microsoft .NET Framework. Środowisko uruchomieniowe języka wspólnego można traktować jako agenta, który zarządza kodem w czasie wykonywania, zapewniając podstawowe usługi, takie jak zarządzanie pamięcią, zarządzanie wątkami i komunikacja zdalna, a także wymuszanie ścisłego bezpieczeństwa kodu. W rzeczywistości koncepcja zarządzania kodem jest podstawową zasadą środowiska uruchomieniowego języka wspólnego. Kod przeznaczony dla środowiska uruchomieniowego języka wspólnego jest nazywany kodem zarządzanym. Kod, który nie jest przeznaczony dla środowiska uruchomieniowego języka wspólnego, jest znany jako kod natywny.

Biblioteka klas struktury to kompleksowa, obiektowa kolekcja klas wielokrotnego użytku, których można użyć do tworzenia aplikacji, począwszy od tradycyjnych aplikacji wiersza polecenia lub graficznego interfejsu użytkownika (GUI) po aplikacje oparte na najnowszych innowacjach oferowanych przez ASP.NET i usługi sieci Web.

Biblioteka zarządzana komputera typu Tablet zawiera zestaw obiektów zarządzanych, który rozszerza platformę w celu zapewnienia obsługi danych wejściowych i wyjściowych pisma ręcznego na komputerze tabletu, a także wymiany danych z innymi komputerami.

Wyjątki

Zarządzane obiekty biblioteki w interfejsie API komputera tabletowego opakowują implementacje biblioteki COM. Gdy podstawowy obiekt biblioteki COM lub kontrolka zwraca błąd, zarządzany interfejs API zgłosi wyjątek Marshal.ThrowExceptionForHR, który zawiera szczegółowe informacje dotyczące wewnętrznego wyjątku COM. Możesz zapoznać się z wartościami HRESULT w dokumentacji biblioteki COM, aby uzyskać szczegóły dotyczące możliwych błędów, które mogą wystąpić.

Porównanie obiektów

Dla wszystkich obiektów w zarządzanej bibliotece Platformy komputerów tabletowych, Equals nie jest zastępowany, aby poprawnie porównać dwa obiekty, które są identyczne. Interfejs programowania aplikacji zarządzanych (API) nie obsługuje porównywania obiektów pod kątem równości za pośrednictwem funkcji Equals lub operatora equals (==).

Wiązanie z najnowszą wersją Microsoft.Ink.dll

Najnowszy zestaw Microsoft.Ink.dll jest zgodnym zamiennikiem Microsoft.Ink.dll w wersji 1.0 i Microsoft.Ink.15.dll. W większości przypadków nie trzeba wprowadzać żadnych zmian w aplikacjach, które są dystrybuowane ze starszymi zestawami. Jednak w niektórych przypadkach należy poinstruować moduł ładujący środowiska uruchomieniowego języka wspólnego, aby używał nowszej biblioteki łączy dynamicznie (DLL) w przypadkach, w których starsze biblioteki DLL są referencjonowane.

Jedynym razem, gdy konieczne jest jawne powiązanie z nowym zestawem przy użyciu poniższej techniki, jest użycie przez aplikację składnika odwołującego się do zestawu w wersji 1.0 lub 1.5 w połączeniu ze składnikiem odwołującym się do nowszego zestawu wersji, takiego jak 1.7, i jeśli te składniki mogą wymieniać dane.

Najlepszym sposobem nakazania modułowi ładującemu środowiska uruchomieniowego języka wspólnego korzystania z nowszej biblioteki DLL jest przekierowanie wersji zestawów na poziomie aplikacji. Możesz określić, że aplikacja używa nowszej wersji zestawu, umieszczając informacje o powiązaniu zestawu w pliku konfiguracji aplikacji. Aby uzyskać więcej informacji na temat przekierowywania wersji zestawów na poziomie aplikacji, odnieś się do Przekierowanie wersji zestawu, w szczególności do sekcji "Określanie powiązania zestawu w plikach konfiguracji".

Musisz utworzyć plik konfiguracji w tym samym katalogu co plik wykonywalny. Plik konfiguracji musi mieć taką samą nazwę jak plik wykonywalny, a następnie rozszerzenie pliku .config. Na przykład w przypadku aplikacji MyApp.exeplik konfiguracji musi być plikiem MyApp.exe.config. Plik konfiguracji używa elementu bindingRedirect, aby wymusić mapowanie wszystkich wcześniejszych wersji na najnowszą wersję, jak pokazano w poniższym przykładzie:

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

Aby uzyskać więcej informacji na temat plików konfiguracji, w tym przykłady konstruowania języka Extensible Markup Language (XML) dla pliku konfiguracji, zobacz bindingRedirect i Redirecting Assembly Versions.

Aplikacje utworzone za pomocą zestawu Microsoft Windows XP Tablet PC Edition Development Kit 1.7 i nowszych wersji są automatycznie powiązane z nową wersją zestawu Microsoft.Ink. Aby uzyskać więcej informacji na temat powiązania zestawu, zobacz Jak środowisko uruchomieniowe lokalizuje zestawy.

Notatka

Korzystanie z zasad aplikacji do powiązania z zaktualizowanym zestawem nie działa w przypadku aplikacji używających klasy Divider lub klasy PenInputPanel. Aplikacje korzystające z jednej z tych klas muszą nadal używać Microsoft.Ink.15.dll lub być ponownie skompilowane po odwołaniu się do zaktualizowanego zestawu.

 

Pracowanie ze zdarzeniami

Jeśli kod programu obsługi zdarzeń dla któregokolwiek z zarządzanych obiektów zgłasza wyjątek, wyjątek nie jest dostarczany użytkownikowi. Aby upewnić się, że wyjątki są dostarczane, używaj bloków try-catch w programach obsługi zdarzeń dla zdarzeń zarządzanych.

Zarządzanie formularzami

Klasa Form i jej klasy bazowe nie definiują finalizatora. Aby wyczyścić zasoby w formularzu, napisz podklasę, która udostępnia finalizator (na przykład destruktor języka C# przy użyciu ~), który wywołuje Dispose. Aby wykonać oczyszczanie finalizatora zastępuje metodę Dispose, a następnie wywołuje klasę bazową Dispose. Nie należy odwoływać się do innych obiektów, które wymagają metody Finalize w metodzie Dispose, gdy parametr logiczny jest FALSE, ponieważ te obiekty mogły już zostać sfinalizowane. Aby uzyskać więcej informacji na temat wydawania zasobów, zobacz Finalizowanie metod i destruktorów.

Formularze i kontekst rozpoznawania

Zdarzenia w RecognizerContext są wykonywane w innym wątku niż ten, na którym działa formularz. Kontrolki w formularzach systemu Windows są powiązane z określonym wątkiem i nie są bezpieczne wątkowo. W związku z tym należy użyć jednej z metod wywołania elementu sterującego, aby przekazać wywołanie do odpowiedniego wątku. Cztery metody kontrolki są bezpieczne dla wątków: Invoke, BeginInvoke, EndInvokei CreateGraphics. Dla wszystkich innych wywołań metod skorzystaj z jednej z tych metod, gdy wywołujesz z innego wątku. Aby uzyskać więcej informacji na temat używania tych metod, zobacz Manipulowanie kontrolkami z wątków.

Oczekiwanie na zdarzenia

Środowisko tabletu PC jest wielowątkowe. Użyj funkcji CoWaitForMultipleHandles zamiast innych metod oczekiwania, aby umożliwić wywołaniom wejściowym modelu obiektów składników (COM) wejście do wielo-wątkowego apartamentu (MTA) podczas oczekiwania aplikacji na zdarzenie.

Korzystanie z kolekcji pociągnięć pisma odręcznego

Wystąpienia kolekcji Strokes, które są uzyskiwane z obiektu Ink, nie są wyrzucane z pamięci. Aby uniknąć wycieku pamięci, za każdym razem, gdy pracujesz z jedną z tych kolekcji, korzystaj z instrukcji "using", jak pokazano poniżej.

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

Usuwanie zarządzanych obiektów i kontrolek

Aby uniknąć przecieku pamięci, należy jawnie wywołać metodę Dispose na dowolnym obiekcie lub kontrolce komputera tabletu, do którego został dołączony program obsługi zdarzeń, zanim obiekt lub kontrolka wykracza poza zakres.

Aby poprawić wydajność aplikacji, należy ręcznie usunąć następujące obiekty, kontrolki i kolekcję, gdy nie są już potrzebne.

W poniższym przykładzie w języku C# przedstawiono niektóre scenariusze, w których jest używana metoda 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;
}