Compartir a través de


Uso de la biblioteca administrada

Common Language Runtime es la base de Microsoft .NET Framework. Puede pensar en Common Language Runtime como agente que administra el código en tiempo de ejecución, proporcionando servicios principales, como la administración de memoria, la administración de subprocesos y la comunicación remota, al mismo tiempo que exige una seguridad estricta del código. De hecho, el concepto de administración de código es un principio fundamental de Common Language Runtime. El código que tiene como destino Common Language Runtime se conoce como código administrado. El código que no tiene como destino Common Language Runtime se conoce como código nativo.

La biblioteca de clases framework es una colección completa orientada a objetos de clases reutilizables que se pueden usar para desarrollar aplicaciones que van desde aplicaciones de línea de comandos tradicionales o de interfaz gráfica de usuario (GUI) a aplicaciones basadas en las últimas innovaciones proporcionadas por ASP.NET y servicios web.

La biblioteca administrada de Tablet PC contiene un conjunto de objetos administrados que amplía el marco para proporcionar compatibilidad con la entrada y salida de escritura a mano en el pc tablet, así como el intercambio de datos con otros equipos.

Excepciones

Los objetos de biblioteca administrados de la API de PC tablet encapsulan las implementaciones de la biblioteca COM. Cuando el control o el objeto de biblioteca COM subyacente devuelven un error, la API administrada producirá una excepción Marshal.ThrowExceptionForHR que proporciona los detalles sobre la excepción COM interna. Puede consultar los valores HRESULT en la Referencia de la biblioteca COM para obtener más información sobre los posibles errores que se pueden devolver.

Comparación de objetos

En el caso de todos los objetos de la biblioteca administrada de plataforma de PC tablet, Equals no se invalida para comparar correctamente dos objetos que son los mismos. La interfaz de programación de aplicaciones administradas (API) no admite la comparación de objetos para la igualdad, ya sea a través de la función Equals o mediante el operador equals (==).

Enlace a la Microsoft.Ink.dll más reciente

El ensamblado de Microsoft.Ink.dll más reciente es un reemplazo compatible para Microsoft.Ink.dll versión 1.0 y Microsoft.Ink.15.dll. En la mayoría de los casos, no es necesario realizar cambios en las aplicaciones que se distribuyen con los ensamblados anteriores. Sin embargo, en algunos casos debe indicar al cargador de Common Language Runtime que use la biblioteca de vínculos dinámicos (DLL) más reciente donde se haya hecho referencia a los archivos DLL anteriores.

La única vez que necesita enlazar explícitamente al nuevo ensamblado mediante la siguiente técnica es si la aplicación usa un componente que hace referencia al ensamblado de la versión 1.0 o 1.5 en combinación con un componente que hace referencia a un ensamblado de versión más reciente, como 1.7, y si esos componentes pueden intercambiar datos.

La mejor manera de indicar al cargador de Common Language Runtime que use el archivo DLL más reciente es redirigir las versiones de ensamblado en el nivel de aplicación. Puede especificar que la aplicación use la versión más reciente del ensamblado colocando la información de enlace de ensamblado en el archivo de configuración de la aplicación. Para obtener más información sobre cómo redirigir las versiones de ensamblado en el nivel de aplicación, vea Redireccionamiento de versiones de ensamblado, específicamente la sección "Especificar enlace de ensamblado en archivos de configuración".

Deberá crear un archivo de configuración en el mismo directorio que el archivo ejecutable. El archivo de configuración debe tener el mismo nombre que el ejecutable, seguido de la extensión de archivo .config. Por ejemplo, para una aplicación, MyApp.exe, el archivo de configuración debe ser el archivo de MyApp.exe.config. El archivo de configuración usa un elemento bindingRedirect para forzar que todas las versiones anteriores se asignen a la versión más reciente, como se muestra en el ejemplo siguiente:

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

Para obtener más información sobre los archivos de configuración, incluidos ejemplos de cómo construir el lenguaje de marcado extensible (XML) para el archivo de configuración, vea bindingRedirect y Redirecting Assembly Versions.

Las aplicaciones creadas con microsoft Windows XP Tablet PC Development Kit 1.7 y versiones posteriores se enlazan automáticamente a la nueva versión del ensamblado Microsoft.Ink. Para obtener más información sobre el enlace de ensamblados, vea How the Runtime Locates Assemblies.

Nota

El uso de la directiva de aplicación para enlazar al ensamblado actualizado no funciona para las aplicaciones que usan la clase Divider o la clase PenInputPanel . Las aplicaciones que usan cualquiera de esas clases deben seguir usando Microsoft.Ink.15.dll o volver a compilarse después de hacer referencia al ensamblado actualizado.

 

Trabajar con eventos

Si el código de un controlador de eventos para cualquiera de los objetos administrados produce una excepción, la excepción no se entrega al usuario. Para asegurarse de que se entregan excepciones, use bloques try-catch en los controladores de eventos para eventos administrados.

Administración de formularios

La clase Form y sus clases base no definen un finalizador. Para limpiar los recursos de un formulario, escriba una subclase que proporcione un finalizador (por ejemplo, el destructor de C# mediante ~) que llama a Dispose. Para realizar la limpieza, el finalizador invalida Dispose y, a continuación, llama a la clase base Dispose. No haga referencia a otros objetos que requieran el método Finalize en el método Dispose cuando el parámetro booleano sea FALSE, ya que es posible que esos objetos ya se hayan finalizado. Para obtener más información sobre cómo liberar recursos, vea Finalizar métodos y destructores.

Forms y RecognizerContext

Los eventos RecognizerContext se ejecutan en un subproceso diferente al subproceso en el que se encuentra el formulario. Los controles de Windows Forms están enlazados a un subproceso específico y no son seguros para subprocesos. Por lo tanto, debe usar uno de los métodos de invocación del control para serializar la llamada al subproceso adecuado. Cuatro métodos de un control son seguros para subprocesos: los métodos Invoke, BeginInvoke, EndInvoke y CreateGraphics . Para todas las demás llamadas de método, use uno de estos métodos de invocación al llamar desde un subproceso diferente. Para obtener más información sobre el uso de estos métodos, vea Manipular controles desde subprocesos.

Esperando eventos

El entorno de tablet PC es multiproceso. Use la función CoWaitForMultipleHandles en lugar de otros métodos de espera para permitir que las llamadas al modelo de objetos componentes (COM) vuelvan a entrar en el apartamento multiproceso (MTA) mientras la aplicación está esperando un evento.

Uso de colecciones de trazos de lápiz

Las instancias de colecciones Strokes que se obtienen de un objeto Ink no se recopilan como elementos no utilizados. Para evitar una pérdida de memoria, siempre que trabaje con una de estas colecciones, use la instrucción "using", como se muestra a continuación.

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

Eliminación de objetos y controles administrados

Para evitar una pérdida de memoria, debe llamar explícitamente al método Dispose en cualquier objeto de Tablet PC o control al que se haya asociado un controlador de eventos antes de que el objeto o el control salga del ámbito.

Para mejorar el rendimiento de la aplicación, elimine manualmente los siguientes objetos, controles y recopilación cuando ya no sean necesarios.

En el ejemplo de C# siguiente se muestran algunos escenarios en los que se usa el método 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;
}