Compartilhar via


Usando a biblioteca gerenciada

O Common Language Runtime é a base do microsoft .NET Framework. Você pode pensar no Common Language Runtime como um agente que gerencia o código em tempo de execução, fornecendo serviços principais, como gerenciamento de memória, gerenciamento de threads e comunicação remota, além de impor uma segurança estrita de código. Na verdade, o conceito de gerenciamento de código é um princípio fundamental do common language runtime. O código direcionado ao Common Language Runtime é conhecido como código gerenciado. O código que não tem como destino o Common Language Runtime é conhecido como código nativo.

A biblioteca de classes framework é uma coleção abrangente e orientada a objetos de classes reutilizáveis que você pode usar para desenvolver aplicativos que vão desde aplicativos tradicionais de gui (interface do usuário) de linha de comando ou gráfica até aplicativos com base nas inovações mais recentes fornecidas pelo ASP.NET e serviços Web.

A Biblioteca Gerenciada do Tablet pc contém um conjunto de objetos gerenciados que estende a Estrutura para fornecer suporte para entrada e saída de manuscrito no Tablet PC, bem como intercâmbio de dados com outros computadores.

Exceções

Os objetos da biblioteca gerenciada na API do Tablet PC encapsulam as implementações da biblioteca COM. Quando o objeto ou controle da biblioteca COM subjacente retornar um erro, a API gerenciada lançará uma exceção Marshal.ThrowExceptionForHR que fornece os detalhes sobre a exceção COM interna. Você pode consultar os valores HRESULT na Referência da Biblioteca COM para obter detalhes sobre os possíveis erros que podem ser retornados.

Comparação de objetos

Para todos os objetos na biblioteca Gerenciada da Plataforma tablet pc, Equals não é substituído para comparar corretamente dois objetos que são iguais. A API (interface de programação de aplicativo gerenciado) não dá suporte à comparação de objetos para igualdade, seja por meio da função Equals ou por meio do operador equals (==).

Associação à Microsoft.Ink.dll mais recente

O assembly de Microsoft.Ink.dll mais recente é uma substituição compatível para Microsoft.Ink.dll versão 1.0 e Microsoft.Ink.15.dll. Na maioria dos casos, você não precisa fazer nenhuma alteração em seus aplicativos que são distribuídos com os assemblies mais antigos. No entanto, em alguns casos, você precisa instruir o carregador de common language runtime a usar a DLL (biblioteca de vínculo dinâmico) mais recente, onde quer que as DLLs mais antigas tenham sido referenciadas.

A única vez que você precisa associar explicitamente ao novo assembly usando a técnica a seguir é se o aplicativo usa um componente que referencia o assembly versão 1.0 ou 1.5 em combinação com um componente que faz referência a um assembly de versão mais recente, como 1.7, e se esses componentes podem trocar dados.

A melhor maneira de instruir o carregador do Common Language Runtime a usar a DLL mais recente é redirecionar as versões do assembly no nível do aplicativo. Você pode especificar que seu aplicativo use a versão mais recente do assembly colocando informações de associação de assembly no arquivo de configuração do aplicativo. Para obter mais informações sobre como redirecionar versões de assembly no nível do aplicativo, consulte Redirecionando versões de assembly, especificamente a seção "Especificando associação de assembly em arquivos de configuração".

Você precisará criar um arquivo de configuração no mesmo diretório que o arquivo executável. O arquivo de configuração deve ter o mesmo nome que o executável, seguido pela extensão de arquivo .config. Por exemplo, para um aplicativo, MyApp.exe, o arquivo de configuração deve ser o arquivo MyApp.exe.config. O arquivo de configuração usa um elemento bindingRedirect para forçar que todas as versões anteriores sejam mapeadas para a versão mais recente, conforme mostrado no exemplo a seguir:

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

Para obter mais informações sobre arquivos de configuração, incluindo exemplos de como construir a XML (Linguagem de Marcação Extensível) para o arquivo de configuração, consulte bindingRedirect e Redirecting Assembly Versions.

Os aplicativos criados com o Microsoft Windows XP Tablet PC Edition Development Kit 1.7 e versões posteriores são automaticamente associados à nova versão do assembly Microsoft.Ink. Para obter mais informações sobre a associação de assembly, consulte Como o runtime localiza assemblies.

Observação

Usar a política de aplicativo para associar ao assembly atualizado não funciona para aplicativos que usam a classe Divider ou a classe PenInputPanel . Os aplicativos que usam uma dessas classes devem continuar a usar Microsoft.Ink.15.dll ou ser recompilados após referenciar o assembly atualizado.

 

Trabalhando com eventos

Se o código dentro de um manipulador de eventos para qualquer um dos objetos gerenciados gerar uma exceção, a exceção não será entregue ao usuário. Para garantir que as exceções sejam entregues, use blocos try-catch em seus manipuladores de eventos para eventos gerenciados.

Gerenciando formulários

A classe Form e suas classes base não definem um finalizador. Para limpo seus recursos em um formulário, escreva uma subclasse que fornece um finalizador (por exemplo, o destruidor C# usando o ~) que chama Dispose. Para fazer a limpeza, o finalizador substitui Dispose e chama a classe base Dispose. Não se refira a outros objetos que exigem o método Finalize no método Dispose quando o parâmetro booliano é FALSE, pois esses objetos podem já ter sido finalizados. Para obter mais informações sobre como liberar recursos, consulte Finalizar métodos e destruidores.

Formulários e o RecognizerContext

Os eventos RecognizerContext são executados em um thread diferente do thread em que o formulário está. Os controles em Windows Forms são associados a um thread específico e não são thread-safe. Portanto, você deve usar um dos métodos de invocação do controle para realizar marshaling da chamada para o thread apropriado. Quatro métodos em um controle são thread safe: os métodos Invoke, BeginInvoke, EndInvoke e CreateGraphics . Para todas as outras chamadas de método, use um desses métodos de invocação ao chamar de um thread diferente. Para obter mais informações sobre como usar esses métodos, consulte Manipulando controles de threads.

Aguardando eventos

O ambiente do Tablet PC é multithread. Use a função CoWaitForMultipleHandles em vez de outros métodos de espera para permitir que chamadas COM (Modelo de Objeto de Componente) de novo participante insiram seu MTA (apartamento multithread) enquanto o aplicativo aguarda um evento.

Usando coleções de traços de tinta

Instâncias de coleções strokes obtidas de um objeto Ink não são coletas de lixo. Para evitar um vazamento de memória, sempre que você estiver trabalhando com uma dessas coleções, use a instrução "using", conforme mostrado abaixo.

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

Descartando objetos e controles gerenciados

Para evitar um vazamento de memória, você deve chamar explicitamente o método Dispose em qualquer objeto tablet pc ou controle ao qual um manipulador de eventos foi anexado antes que o objeto ou controle saia do escopo.

Para melhorar o desempenho do aplicativo, descarte manualmente os seguintes objetos, controles e coleção quando eles não forem mais necessários.

O exemplo de C# a seguir demonstra alguns cenários em que o método Dispose é usado.

// 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;
}