Utilisation de la bibliothèque managée
Le Common Language Runtime est la base de Microsoft .NET Framework. Vous pouvez considérer le Common Language Runtime comme un agent qui gère le code au moment de l’exécution, fournissant des services de base tels que la gestion de la mémoire, la gestion des threads et la communication à distance, tout en appliquant une sécurité stricte du code. En fait, le concept de gestion du code est un principe fondamental du Common Language Runtime. Le code qui cible le Common Language Runtime est appelé code managé. Le code qui ne cible pas le Common Language Runtime est appelé code natif.
La bibliothèque de classes Framework est une collection complète orientée objet de classes réutilisables que vous pouvez utiliser pour développer des applications allant d’applications en ligne de commande ou d’interface graphique utilisateur traditionnelles aux applications basées sur les dernières innovations fournies par ASP.NET et les services web.
La bibliothèque gérée tablet PC contient un ensemble d’objets managés qui étend l’infrastructure pour prendre en charge l’entrée et la sortie de l’écriture manuscrite sur tablet PC, ainsi que l’échange de données avec d’autres ordinateurs.
Exceptions
Les objets de bibliothèque managée dans l’API Tablet PC encapsulent les implémentations de bibliothèque COM. Lorsque l’objet ou le contrôle de bibliothèque COM sous-jacent retourne une erreur, les API managées lèvent une exception Marshal.ThrowExceptionForHR qui fournit les détails sur l’exception COM interne. Vous pouvez vous référer aux valeurs HRESULT dans la référence de bibliothèque COM pour plus d’informations sur les erreurs possibles qui peuvent être retournées.
Comparaison d’objets
Pour tous les objets de la bibliothèque gérée de la plateforme Tablet PC, Equals n’est pas remplacé pour comparer correctement deux objets identiques . L’interface de programmation d’applications managées (API) ne prend pas en charge la comparaison d’objets pour l’égalité, par le biais de la fonction Equals ou de l’opérateur equals (==).
Liaison à la dernière Microsoft.Ink.dll
Le dernier assembly Microsoft.Ink.dll est un remplacement compatible pour Microsoft.Ink.dll version 1.0 et Microsoft.Ink.15.dll. Dans la plupart des cas, vous n’avez pas besoin d’apporter de modifications à vos applications distribuées avec les assemblys plus anciens. Toutefois, dans certains cas, vous devez indiquer au chargeur du Common Language Runtime d’utiliser la bibliothèque de liens dynamiques (DLL) plus récente partout où les anciennes DLL ont été référencées.
Le seul moment où vous devez établir une liaison explicite avec le nouvel assembly à l’aide de la technique suivante est si votre application utilise un composant qui référence l’assembly version 1.0 ou 1.5 en combinaison avec un composant qui fait référence à un assembly de version plus récent, tel que 1.7, et si ces composants peuvent échanger des données.
La meilleure façon d’indiquer au chargeur du Common Language Runtime d’utiliser la DLL la plus récente consiste à rediriger les versions d’assembly au niveau de l’application. Vous pouvez spécifier que votre application utilise la version la plus récente de l’assembly en plaçant les informations de liaison d’assembly dans le fichier de configuration de votre application. Pour plus d’informations sur la redirection des versions d’assembly au niveau de l’application, consultez Redirection des versions d’assembly, en particulier la section « Spécification de la liaison d’assembly dans les fichiers de configuration ».
Vous devez créer un fichier de configuration dans le même répertoire que votre fichier exécutable. Le fichier de configuration doit avoir le même nom que votre exécutable, suivi de l’extension de fichier .config. Par exemple, pour une application, MyApp.exe, le fichier de configuration doit être le fichier MyApp.exe.config. Le fichier de configuration utilise un élément bindingRedirect pour forcer le mappage de toutes les versions antérieures à la dernière version, comme illustré dans l’exemple suivant :
<bindingRedirect oldVersion="0.0.0.0-1.7.2600.xxxx" newVersion="1.7.2600.xxxx" />
Pour plus d’informations sur les fichiers de configuration, notamment des exemples de construction du langage XML (Extensible Markup Language) pour le fichier de configuration, consultez bindingRedirect et Redirecting Assembly Versions.
Les applications créées avec microsoft Windows XP Tablet PC Edition Development Kit 1.7 et versions ultérieures sont automatiquement liées à la nouvelle version de l’assembly Microsoft.Ink. Pour plus d’informations sur la liaison d’assemblys, consultez Comment le runtime localise les assemblys.
Notes
L’utilisation de la stratégie d’application pour lier à l’assembly mis à jour ne fonctionne pas pour les applications qui utilisent la classe Divider ou la classe PenInputPanel . Les applications qui utilisent l’une de ces classes doivent continuer à utiliser Microsoft.Ink.15.dll ou être recompilées après avoir référencé l’assembly mis à jour.
Utilisation des événements
Si le code dans un gestionnaire d’événements pour l’un des objets managés lève une exception, l’exception n’est pas remise à l’utilisateur. Pour vous assurer que les exceptions sont remises, utilisez des blocs try-catch dans vos gestionnaires d’événements pour les événements managés.
Gestion des formulaires
La classe Form et ses classes de base ne définissent pas de finaliseur. Pour propre vos ressources sur un formulaire, écrivez une sous-classe qui fournit un finaliseur (par exemple, le destructeur C# à l’aide de ~) qui appelle Dispose. Pour effectuer le nettoyage, le finaliseur remplace Dispose, puis appelle la classe de base Dispose. Ne faites pas référence à d’autres objets qui nécessitent la méthode Finalize dans la méthode Dispose lorsque le paramètre booléen a la valeur FALSE, car ces objets ont peut-être déjà été finalisés. Pour plus d’informations sur la publication de ressources, consultez Finaliser les méthodes et les destructeurs.
Forms et recognizerContext
Les événements RecognizerContext s’exécutent dans un thread différent du thread sur lequel se trouve le formulaire. Les contrôles dans Windows Forms sont liés à un thread spécifique et ne sont pas thread-safe. Par conséquent, vous devez utiliser l’une des méthodes invoke du contrôle pour marshaler l’appel vers le thread approprié. Quatre méthodes sur un contrôle sont thread-safe : les méthodes Invoke, BeginInvoke, EndInvoke et CreateGraphics . Pour tous les autres appels de méthode, utilisez l’une de ces méthodes d’appel lors de l’appel à partir d’un thread différent. Pour plus d’informations sur l’utilisation de ces méthodes, consultez Manipulation de contrôles à partir de threads.
Attente d’événements
L’environnement Tablet PC est multithread. Utilisez la fonction CoWaitForMultipleHandles au lieu d’autres méthodes d’attente pour autoriser les appels COM (Component Object Model) à entrer dans votre appartement multithread (MTA) pendant que votre application attend un événement.
Utilisation de collections de traits d’encre
Les instances des collections Strokes obtenues à partir d’un objet Ink ne sont pas récupérées par la mémoire. Pour éviter une fuite de mémoire, chaque fois que vous travaillez avec l’une de ces collections, utilisez l’instruction « using » comme indiqué ci-dessous.
using (Strokes strokes = myInk.Strokes)
{
int i = strokes.Count;
}
Suppression des objets managés et des contrôles
Pour éviter une fuite de mémoire, vous devez appeler explicitement la méthode Dispose sur tout objet ou contrôle Tablet PC auquel un gestionnaire d’événements a été attaché avant que l’objet ou le contrôle ne sorte de l’étendue.
Pour améliorer les performances de votre application, supprimez manuellement les objets, contrôles et regroupements suivants quand ils ne sont plus nécessaires.
- Diviseur
- Entrée manuscrite
- Inkcollector
- Inkedit
- Inkoverlay
- Inkpicture
- PenInputPanel
- Recognizercontext
- Coups
L’exemple C# suivant illustre certains scénarios dans lesquels la méthode Dispose est utilisée.
// 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;
}