Поделиться через


Использование управляемой библиотеки

Общеязыковая среда выполнения является основой Microsoft .NET Framework. Среду CLR можно рассматривать как агент, который управляет кодом во время выполнения, предоставляя основные службы, такие как управление памятью, управление потоками и удаленное взаимодействие, а также строгое обеспечение безопасности кода. На самом деле, концепция управления кодом является основным принципом среды CLR. Код, предназначенный для общего языкового времени выполнения (CLR), называется управляемым кодом. Код, не предназначенный для среды CLR, называется машинным кодом.

Библиотека классов Framework — это комплексная объектно-ориентированная коллекция повторно используемых классов, которые можно использовать для разработки приложений, начиная от традиционных приложений командной строки или графического пользовательского интерфейса (GUI) к приложениям на основе последних инноваций, предоставляемых ASP.NET и веб-службами.

Управляемая библиотека планшетного компьютера содержит набор управляемых объектов, расширяющих платформу, чтобы обеспечить поддержку ввода и вывода рукописного ввода на планшетном компьютере, а также обмена данными с другими компьютерами.

Исключения

Объекты управляемой библиотеки в API планшетного пк упаковывают реализации библиотек COM. Когда базовый объект библиотеки COM или элемент управления возвращает ошибку, управляемый API создает исключение Marshal.ThrowExceptionForHR, которое предоставляет сведения о внутреннем исключении COM. Дополнительные сведения о значениях HRESULT и возможных ошибках, которые могут быть возвращены, см. в справочнике по библиотеке COM.

Сравнение объектов

Для всех объектов в управляемой библиотеке платформы планшетного пк Равно не переопределяется для правильного сравнения двух объектов, которые одинаковы. Интерфейс программирования управляемого приложения (API) не поддерживает сравнение объектов на эквивалентность через функцию равно или оператор equals (==).

Привязка к последней Microsoft.Ink.dll

Последняя сборка Microsoft.Ink.dll является совместимой заменой Microsoft.Ink.dll версии 1.0 и Microsoft.Ink.15.dll. В большинстве случаев вам не нужно вносить изменения в приложения, распределенные со старыми сборками. Однако в некоторых случаях необходимо указать загрузчику общего языка выполнения (CLR) использовать более новую библиотеку динамической компоновки (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) для файла конфигурации, см. как bindingRedirect, так и перенаправление версий сборок.

Приложения, созданные с помощью пакета средств разработки Microsoft Windows XP Pc Edition версии 1.7 и более поздних версий, автоматически привязаны к новой версии сборки Microsoft.Ink. Дополнительные сведения о привязке сборок см. в разделе «Как среда выполнения находит сборки».

Заметка

Использование политики приложений для привязки к обновленной сборке не работает для приложений, использующих класс Divider или класс PenInputPanel. Приложения, использующие любой из этих классов, должны продолжать использовать Microsoft.Ink.15.dll или перекомпилироваться после ссылки на обновленную сборку.

 

Работа с событиями

Если код в обработчике событий для любого из управляемых объектов вызывает исключение, исключение не доставляется пользователю. Чтобы обеспечить доставку исключений, используйте блоки try-catch в обработчиках событий для управляемых событий.

Управление формами

Класс Form и его базовые классы не определяют метод завершения. Чтобы очистить ресурсы в форме, напишите подкласс, предоставляющий метод завершения (например, деструктор C# с помощью ~), который вызывает Dispose. Чтобы выполнить очистку, финализатор переопределяет метод Dispose, а затем вызывает метод Dispose базового класса. Не ссылайтесь на другие объекты, которые требуют метод Finalize в методе Dispose, когда логический параметр равен FALSE, потому что эти объекты уже могли быть подвергнуты завершению. Дополнительные сведения об освобождении ресурсов см. в разделе Методы завершения и деструкторы.

Формы и Контекст Распознавателя

RecognizerContext события выполняются в другом потоке, отличном от потока, в котором находится форма. Элементы управления в Windows Forms привязаны к определенному потоку и не являются потокобезопасными. Поэтому вы должны использовать один из методов вызова элемента управления, чтобы маршалировать вызов в нужный поток. Четыре метода в элементе управления являются потокобезопасными: метод Invoke, метод BeginInvoke, метод EndInvokeи метод CreateGraphics. Для всех других вызовов методов используйте один из этих методов при вызове из другого потока. Дополнительные сведения об использовании этих методов см. в разделе Управление элементами управления из потоков.

Ожидание событий

Среда планшетного компьютера многопотоковая. Используйте функцию CoWaitForMultipleHandles вместо других методов ожидания, чтобы разрешить повторным вызовам объектной модели компонента (COM) входить в ваш многопоточный апартамент (MTA), пока ваше приложение ожидает события.

Использование коллекций рукописных росчерков

Экземпляры штрихов коллекций, полученные из объекта Ink, не подлежат сборке мусора. Чтобы избежать утечки памяти, при работе с одной из этих коллекций используйте оператор «using», как показано ниже.

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

Удаление управляемых объектов и элементов управления

Чтобы избежать утечки памяти, необходимо явно вызвать метод 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;
}