Condividi tramite


Uso della libreria gestita

Common Language Runtime è la base di Microsoft .NET Framework. È possibile considerare Common Language Runtime come un 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 al tempo stesso una rigorosa sicurezza del codice. In realtà, 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 offerte 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 della libreria gestita nell'API Tablet PC incapsulare 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 della piattaforma Tablet PC, 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 (==).

Binding alla Microsoft.Ink.dll più recente

L'assembly 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 meno recenti. In alcuni casi, tuttavia, è necessario indicare al caricatore di Common Language Runtime di usare la dll (Dynamic Link Library) più recente ovunque vi si faccia riferimento alle DLL precedenti.

L'unica volta che è necessario eseguire l'associazione esplicita al nuovo assembly usando la tecnica seguente è se l'applicazione usa un componente che fa riferimento all'assembly 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 dell'eseguibile, seguito dall'estensione di 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 extensible markup language (XML) per il file di configurazione, vedere sia bindingRedirect che Redirecting Assembly Versions.

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 altre informazioni sull'associazione di assembly, vedere How the Runtime Locates Assemblies .For more information about assembly binding see How the Runtime Locates Assemblies.

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.

 

Utilizzo degli eventi

Se il codice all'interno di un gestore eventi per uno qualsiasi 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 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.For more information about rilasciing resources see Finalize Methods and Destructors.

Moduli e RecognizerContext

Gli eventi RecognizerContext vengono eseguiti in un thread diverso rispetto al thread in cui si trova il modulo. I controlli in Windows Forms sono associati a un thread specifico e non sono thread-safe. Pertanto, è necessario utilizzare uno dei metodi invoke del controllo per effettuare il marshalling della chiamata al thread appropriato. Quattro metodi in un controllo sono thread-safe: i metodi Invoke, BeginInvoke, EndInvoke e CreateGraphics . Per tutte le altre chiamate di metodo, usare uno di questi metodi invoke quando si chiama da un thread diverso. Per altre informazioni sull'uso di questi metodi, vedere Modifica di controlli da 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) di rientrare nell'apartment multithreading mentre l'applicazione è in attesa di un evento.

Uso delle raccolte tratti input penna

Le istanze delle raccolte Strokes ottenute da un oggetto Ink non vengono raccolte di 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 e controlli gestiti

Per evitare una perdita di memoria, è necessario chiamare in modo esplicito il metodo Dispose su qualsiasi oggetto o controllo Tablet PC 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;
}