Использование управляемой библиотеки
Среда CLR является основой платформа .NET Framework Майкрософт. Среду CLR можно рассматривать как агент, который управляет кодом во время выполнения, предоставляя основные службы, такие как управление памятью, управление потоками и удаленное взаимодействие, а также обеспечивает строгую безопасность кода. На самом деле, концепция управления кодом является фундаментальным принципом среды CLR. Код, предназначенный для среды CLR, называется управляемым кодом. Код, который не предназначен для среды CLR, называется машинным кодом.
Библиотека классов Framework — это комплексная объектно-ориентированная коллекция многократно используемых классов, которую можно использовать для разработки приложений, от традиционных приложений командной строки или графических приложений пользовательского интерфейса (GUI) до приложений на основе последних инноваций, предоставляемых ASP.NET и веб-службами.
Управляемая библиотека планшетного компьютера содержит набор управляемых объектов, расширяющих платформу для обеспечения поддержки ввода и вывода рукописного ввода на планшетном компьютере, а также обмена данными с другими компьютерами.
Исключения
Объекты управляемой библиотеки в API планшетного компьютера упаковывают реализации библиотек COM. Когда базовый объект библиотеки COM или элемент управления возвращает ошибку, управляемый API создает исключение Marshal.ThrowExceptionForHR, которое предоставляет сведения о внутреннем исключении COM. Дополнительные сведения о возможных ошибках, которые могут быть возвращены, см. в справочнике по библиотеке COM.
Сравнение объектов
Для всех объектов в управляемой библиотеке платформы планшетного ПК значение Equals не переопределяется для правильного сравнения двух одинаковых объектов. Программный интерфейс управляемого приложения (API) не поддерживает сравнение объектов на равенство либо с помощью функции Equals , либо с помощью оператора 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, и если эти компоненты могут обмениваться данными.
Лучший способ указать загрузчику среды CLR использовать более новую библиотеку 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 и Redirecting Assembly Versions.
Приложения, созданные с помощью пакета средств разработки Microsoft Windows XP Tablet PC Edition 1.7 и более поздних версий, автоматически привязываются к новой версии сборки Microsoft.Ink. Дополнительные сведения о привязке сборок см. в статье Как среда выполнения находит сборки.
Примечание
Использование политики приложения для привязки к обновленной сборке не работает для приложений, использующих класс Divider или Класс PenInputPanel . Приложения, использующие любой из этих классов, должны продолжать использовать Microsoft.Ink.15.dll или перекомпилироваться после ссылки на обновленную сборку.
Работа с событиями
Если код в обработчике событий для любого из управляемых объектов создает исключение, исключение не доставляется пользователю. Чтобы обеспечить доставку исключений, используйте блоки try-catch в обработчиках событий для управляемых событий.
Управление формами
Класс Form и его базовые классы не определяют метод завершения. Чтобы очистить ресурсы в форме, напишите подкласс, предоставляющий метод завершения (например, деструктор C#, использующий ~), который вызывает Dispose. Для очистки метод завершения переопределяет Dispose, а затем вызывает базовый класс Dispose. Не ссылайтесь на другие объекты, которым требуется метод Finalize в методе Dispose, если логический параметр имеет значение FALSE, так как эти объекты, возможно, уже завершены. Дополнительные сведения о выпуске ресурсов см. в разделе Методы завершения и деструкторы.
Forms и RecognizerContext
События RecognizerContext выполняются в потоке, отличном от потока, в который включена форма. Элементы управления в Windows Forms привязаны к определенному потоку и не являются потокобезопасными. Поэтому необходимо использовать один из методов вызова элемента управления , чтобы маршалировать вызов к соответствующему потоку. Потокобезопасны четыре метода в элементе управления: Invoke, BeginInvoke, EndInvoke и CreateGraphics . Для всех других вызовов методов используйте один из этих методов invoke при вызове из другого потока. Дополнительные сведения об использовании этих методов см. в разделе Управление элементами управления из потоков.
Ожидание событий
Среда планшетного компьютера является многопоточной. Используйте функцию CoWaitForMultipleHandles вместо других методов ожидания, чтобы разрешить повторно вхождющим вызовам объектной модели компонентов (COM) входить в многопоточное пространство (MTA), пока приложение ожидает события.
Использование коллекций рукописных росчерков
Экземпляры коллекций Strokes , полученные из объекта Ink , не собирают мусор. Чтобы избежать утечки памяти, при работе с одной из этих коллекций используйте оператор using, как показано ниже.
using (Strokes strokes = myInk.Strokes)
{
int i = strokes.Count;
}
Удаление управляемых объектов и элементов управления
Чтобы избежать утечки памяти, необходимо явно вызвать метод Dispose на любом объекте или элементе управления Tablet PC, к которому был подключен обработчик событий, прежде чем объект или элемент управления выходит из область.
Чтобы повысить производительность приложения, вручную удалите следующие объекты, элементы управления и коллекцию, когда они больше не нужны.
- Разделитель
- Рукописный ввод
- InkCollector
- InkEdit
- InkOverlay
- InkPicture
- PenInputPanel
- RecognizerContext
- Strokes
В следующем примере 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;
}