Condividi tramite


Uso della libreria gestita

Common Language Runtime è la base di Microsoft .NET Framework. È possibile considerare Common Language Runtime come agente che gestisce il codice in fase di esecuzione, fornendo servizi di base come la gestione della memoria, la gestione dei thread e la comunicazione remota, applicando allo stesso tempo una rigorosa sicurezza del codice. In effetti, il concetto di gestione del codice è un principio fondamentale di Common Language Runtime. Il codice destinato a Common Language Runtime è noto come codice gestito. Il codice che non ha come destinazione Common Language Runtime è noto come codice nativo.

La libreria di classi Framework è una raccolta completa orientata agli oggetti di classi riutilizzabili che è possibile usare per sviluppare applicazioni che vanno dalle applicazioni tradizionali della riga di comando o dell'interfaccia utente grafica alle applicazioni basate sulle innovazioni più recenti fornite da ASP.NET e servizi Web.

La Libreria gestita di Tablet PC contiene un set di oggetti gestiti che estende il framework per fornire supporto per l'input e l'output della grafia su Tablet PC, nonché l'interscambio di dati con altri computer.

Eccezioni

Gli oggetti di libreria gestiti nell'API Tablet PC coinvolgono le implementazioni della libreria COM. Quando l'oggetto o il controllo della libreria COM sottostante restituisce un errore, l'API gestita genererà un'eccezione Marshal.ThrowExceptionForHR che fornisce i dettagli sull'eccezione COM interna. È possibile fare riferimento ai valori HRESULT nella Guida di riferimento alla libreria COM per informazioni dettagliate sui possibili errori che possono essere restituiti.

Confronto tra oggetti

Per tutti gli oggetti nella libreria gestita tablet PC Platform, Equals non viene sottoposto a override per confrontare correttamente due oggetti uguali. L'API (Application Programming Interface) gestita non supporta il confronto di oggetti per l'uguaglianza, tramite la funzione Equals o tramite l'operatore equals (==).

Associazione alla Microsoft.Ink.dll più recente

L'assemblaggio Microsoft.Ink.dll più recente è una sostituzione compatibile per Microsoft.Ink.dll versione 1.0 e Microsoft.Ink.15.dll. Nella maggior parte dei casi, non è necessario apportare modifiche alle applicazioni distribuite con gli assembly precedenti. In alcuni casi, tuttavia, è necessario indicare al caricatore common Language Runtime di usare la libreria a collegamento dinamico (DLL) più recente ovunque si faccia riferimento alle DLL precedenti.

L'unica volta che è necessario associare in modo esplicito al nuovo assembly usando la tecnica seguente è se l'applicazione usa un componente che fa riferimento all'assembly versione 1.0 o 1.5 in combinazione con un componente che fa riferimento a un assembly di versione più recente, ad esempio 1.7 e se tali componenti possono scambiare dati.

Il modo migliore per indicare al caricatore Common Language Runtime di usare la DLL più recente consiste nel reindirizzare le versioni degli assembly a livello di applicazione. È possibile specificare che l'applicazione usi la versione più recente dell'assembly inserendo le informazioni sull'associazione di assembly nel file di configurazione dell'applicazione. Per altre informazioni sul reindirizzamento delle versioni degli assembly a livello di applicazione, vedere Reindirizzamento delle versioni degli assembly, in particolare la sezione "Specifica dell'associazione di assembly nei file di configurazione".

Sarà necessario creare un file di configurazione nella stessa directory del file eseguibile. Il file di configurazione deve avere lo stesso nome del file eseguibile, seguito dall'estensione del file .config. Ad esempio, per un'applicazione, MyApp.exe, il file di configurazione deve essere il file di MyApp.exe.config. Il file di configurazione usa un elemento bindingRedirect per forzare il mapping di tutte le versioni precedenti alla versione più recente, come illustrato nell'esempio seguente:

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

Per altre informazioni sui file di configurazione, inclusi esempi di come costruire il linguaggio XML (Extensible Markup Language) per il file di configurazione, vedere sia bindingRedirect che Reindirizzamento delle versioni dell'assembly.

Le applicazioni create con Microsoft Windows XP Tablet PC Edition Development Kit 1.7 e versioni successive vengono associate automaticamente alla nuova versione dell'assembly Microsoft.Ink. Per ulteriori informazioni sul binding degli assembly, vedere Come il runtime individua gli assembly.

Nota

L'uso dei criteri dell'applicazione per l'associazione all'assembly aggiornato non funziona per le applicazioni che usano la classe Divider o la classe PenInputPanel. Le applicazioni che usano una di queste classi devono continuare a usare Microsoft.Ink.15.dll o essere ricompilate dopo aver fatto riferimento all'assembly aggiornato.

 

Gestione degli eventi

Se il codice all'interno di un gestore eventi per uno degli oggetti gestiti genera un'eccezione, l'eccezione non viene recapitata all'utente. Per assicurarsi che le eccezioni vengano recapitate, usare blocchi try-catch nei gestori eventi per gli eventi gestiti.

Gestione dei moduli

La classe Form e le relative classi di base non definiscono un finalizzatore. Per pulire le risorse in un modulo, scrivere una sottoclasse che fornisce un finalizzatore (ad esempio, il distruttore C# usando ~) che chiama Dispose. Per eseguire la pulizia, il finalizzatore esegue l'override di Dispose e quindi chiama la classe di base Dispose. Non fare riferimento ad altri oggetti che richiedono il metodo Finalize nel metodo Dispose quando il parametro booleano è FALSE, perché tali oggetti potrebbero essere già stati finalizzati. Per altre informazioni sul rilascio delle risorse, vedere Finalize Methods and Destructors.

Moduli e RecognizerContext

Gli eventi di RecognizerContext vengono eseguiti in un thread diverso rispetto a quello in cui si trova il modulo. I controlli in Windows Form sono associati a un thread specifico e non sono thread-safe. Pertanto, è necessario utilizzare uno dei metodi 'invoke' del controllo per gestire la chiamata al thread corretto. Quattro metodi in un controllo sono thread-safe: i metodi Invoke, BeginInvoke, EndInvokee CreateGraphics. Per tutte le altre chiamate al metodo, usare uno di questi metodi invoke quando si chiama da un thread diverso. Per ulteriori informazioni su come utilizzare questi metodi, vedere Manipolare i controlli dai thread.

In attesa di eventi

L'ambiente Tablet PC è multithreading. Usare la funzione CoWaitForMultipleHandles anziché altri metodi di attesa per consentire alle chiamate COM (Component Object Model) ricorsive di entrare nel appartamento multithread (MTA) mentre l'applicazione è in attesa di un evento.

Uso delle raccolte di tratti d'inchiostro

Le istanze delle raccolte di Tratti ottenute da un oggetto Inchiostro non sono soggette a Garbage Collection. Per evitare una perdita di memoria, ogni volta che si utilizza una di queste raccolte, usare l'istruzione "using", come illustrato di seguito.

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

Eliminazione di oggetti gestiti e controlli

Per evitare una perdita di memoria è necessario chiamare in modo esplicito il metodo Dispose su qualsiasi oggetto Tablet PC o controllo a cui è stato collegato un gestore eventi prima che l'oggetto o il controllo esce dall'ambito.

Per migliorare le prestazioni dell'applicazione, eliminare manualmente gli oggetti, i controlli e la raccolta seguenti quando non sono più necessari.

L'esempio C# seguente illustra alcuni scenari in cui viene usato il metodo 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;
}