¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
MSDN Library

Procedimientos recomendados para ejecutar código sin administrar en aplicaciones de Azure

Actualizado: junio de 2014

La escritura de código .NET para aplicaciones de Azure es en gran medida igual que la escritura de código .NET para aplicaciones de Windows. Existen diferencias sutiles a tener en cuenta cuando se escribe código .NET para las distintas plataformas. Este documento proporcionan recomendaciones para ejecutar código no administrado o nativo en aplicaciones de Azure.

Autores: Christian Martinez, Trace Young y Mark Simms

Las secciones siguientes proporcionan recomendaciones para asegurarse de que el código nativo se ejecuta correctamente al desarrollar aplicaciones de Azure que llaman a código nativo.

Para configurar código nativo para compilar en modo de lanzamiento, haga clic con el botón secundario en el proyecto de código nativo, seleccione Propiedades para que aparezca la página Propiedades y seleccione la opción de configuración Lanzamiento disponible en la pestaña Crear de la página de las propiedades:

Opción de compilación del modo de lanzamiento de las propiedades del proyecto

noteNota
Los errores en tiempo de ejecución que indican que falta algún archivo DLL, como msvcr100d.dll o msvcp100d.dll, señalan que el código nativo que se implementó se compiló en modo de depuración. Los archivos msvcr100d.dll y msvcp100d.dll no son archivos DLL redistribuibles. Para obtener más información acerca de cómo determinar qué archivos DLL de C++ redistribuir, vea Determinar qué archivos DLL se redistribuirán (http://go.microsoft.com/fwlink/p/?LinkId=236016).

Siga estos pasos para asegurarse de que la aplicación de Azure puede encontrar cualquier código nativo referenciado cuando se ejecute en un emulador de cálculo de Azure:

  1. Establecer las propiedades adecuadas para los archivos de código nativo compilados en Visual Studio

    Incluya el archivo de código nativo de compilación como un elemento de proyecto y en el cuadro de diálogo Propiedades para el archivo, establezca la opción Copiar en el directorio de salida en Copiar siempre y la opción Acción de compilación en Ninguna.

    De esta forma se copiará el archivo de código nativo compilado en el directorio \bin y garantizará que la aplicación de Azure puede encontrar el archivo de código nativo compilado cuando se ejecute en un emulador de cálculo de Azure.



    Cuadro de diálogo para las acciones de compilación de código no administrado
  2. Al solucionar los problemas de la implementación de RoleEntry en el emulador de cálculo de Azure, puede resultar más fácil depurar problemas si copia el archivo de código nativo compilado en el directorio en tiempo de ejecución devfabric.

    • Por ejemplo, cuando utilice la versión 1.5 del SDK de Azure o anterior, copie el archivo de código nativo compilado en el directorio siguiente:


      C:\Program Files\Azure SDK\[SDK Version]\bin\devfabric\x64\


    • O bien, cuando utilice la versión 1.6 del SDK de Azure o posterior, copie el archivo de código nativo compilado en el directorio siguiente:


      C:\Program Files\Azure SDK\[SDK Version]\bin\runtimes\base\x64\

  3. Asegurarse de que las aplicaciones de Azure que se ejecutan en una instancia de rol web pueden encontrar cualquier código nativo referenciado

    Si una aplicación de Azure hace referencia a código nativo que se ajusta con C++/CLI y la aplicación de Azure se ejecuta en una instancia de rol web, utilice uno de los métodos siguientes para asegurarse de que la aplicación de Azure puede localizar el código nativo referenciado:



    noteNota
    Los pasos siguientes hacen referencia al proyecto CppCliWebRole que se proporciona con el código de ejemplo en PinvokeCppCliInAzure.zip, disponible para su descarga en http://azureunmanagedcode.codeplex.com/. Para más información sobre el código de ejemplo, vea Ejemplos de código: ejecutar código nativo desde las aplicaciones de Azure.

    Método 1: modificar la variable de entorno PATH, después reiniciar el emulador de cálculo e IIS de Azure:

    1. Detenga y salga del emulador de cálculo de Azure.

    2. Edite la variable de entorno PATH para señalar a un directorio que contenga el código compilado.

    3. Escriba iisreset en el símbolo del sistema con privilegios elevados.

    4. Presione F5 para ejecutar el código de ejemplo.

    Método 2: utilizar un comando de inicio

    En los pasos siguientes, el código nativo se encuentra en el archivo ExampleNativeCode.dll.

    1. Detenga y salga del emulador de cálculo de Azure.

    2. Abra el archivo indist.cmd que se incluye con el proyecto CppCliWebRole.

    3. Cambie lo siguiente:

      REM copy "%~dps0ExampleNativeCode.dll" "%windir%\system32\inetsrv"
      
      Para:



      copy "%~dps0ExampleNativeCode.dll" "%windir%\system32\inetsrv"
      
    4. Guarde el proyecto.

    5. Presione F5 para ejecutar el código de ejemplo.

    noteNota
    El uso de un comando de inicio funciona también en las implementaciones reales. Si prefiere evitar las referencias al directorio del sistema IIS, de forma alternativa, puede crear y ejecutar un script para:

    1. Cambiar la variable de entorno PATH para señalar al directorio que contenga el código compilado.

    2. Reiniciar IIS y todos los procesos que dependen del mismo.

Azure es una plataforma de 64 bits, al igual que los hosts de la aplicación Azure (rol de trabajador y web). Si no utiliza un entorno de desarrollo de 64 bits puro y la aplicación hace referencia a código nativo, la aplicación producirá errores. Una prueba sencilla para comprobar que todo el código nativo al que se hace referencia es de 64 bits es probar código nativo con aplicaciones de prueba de consola que están codificadas de forma rígida para ejecutarse como aplicaciones de 64 bits.

De forma predeterminada, solo las bibliotecas en tiempo de ejecución de Visual C++ para Visual C++ 2008 se instalan en el los roles de trabajador y web de Azure. Por tanto, el código nativo compilado con la biblioteca en tiempo de ejecución de Visual C++ para otras versiones de Visual C++ no se cargará en las instancias de rol de trabajo y web. Si tiene instalados Visual Studio 2008 como una versión posterior en el mismo equipo puede utilizar la característica nativa de compatibilidad con múltiples versiones (multitargeting) de Visual Studio para crear bibliotecas nativas para su aplicación con el conjunto de herramientas de la plataforma de Visual Studio 2008 (compilador, vinculador, encabezados y bibliotecas). Para más información sobre cómo utilizar Visual Studio para compilar una aplicación con el conjunto de herramientas de la plataforma de Visual Studio 2008, vea Cómo: Modificar la versión de .NET Framework de destino y el conjunto de herramientas de la plataforma (http://go.microsoft.com/fwlink/?LinkId=324964).

Puede agregar una tarea de inicio con permisos elevados al proyecto de rol de trabajo o web para copiar e instalar la versión necesaria de las bibliotecas en tiempo de ejecución. Los pasos siguientes describen cómo crear una tarea de inicio con permisos elevados para copiar la versión de 64 bits del paquete redistribuible de Microsoft Visual C++ 2010 en un rol de trabajo o un rol web y ejecutar el paquete redistribuible para instalar las bibliotecas de Visual C++ para Visual C++ 2010 en las instancias del rol de trabajo o web. Otras versiones de Visual C++ necesitarán un paquete de distribución específico de esa versión:

  1. Cree una carpeta de inicio para el proyecto del rol de trabajador o web.

  2. Copie vcredist_x64.exe (http://go.microsoft.com/fwlink/p/?LinkId=225987) en la carpeta de inicio.

  3. Cree un archivo de startup.cmd en la carpeta de inicio.

  4. Modifique startup.cmd y agregue la siguiente línea:


    "%~dps0vcredist_x64.exe" /q /norestart


  5. Modifique las propiedades de vcredit_x64.exe y de startup.cmd desde el Explorador de soluciones de Visual Studio. Establezca la opción Acción de compilación en Contenido y la opción de Copiar en el directorio de salida en Copiar si es posterior.

  6. Modifique el archivo ServiceDefinition.csdef para el rol y agregue la tarea de inicio con permisos elevados siguiente para ejecutar startup.cmd:


    < Task commandLine ="Startup\Startup.cmd" executionContext ="elevated" taskType ="simple" />

El mensaje de error que se genera cuando un ensamblado no se puede cargar en el emulador cálculo de Azure puede que no sea intuitivo. Para solucionar los problemas de la carga de archivos de una instancia de host de rol de trabajador o web, utilice el Monitor de procesos como sigue:

  1. Descargue el Monitor de procesos en Monitor de procesos v2.96 (http://go.microsoft.com/fwlink/p/?LinkID=137175).

  2. Inicie el Monitor de procesos para solucionar los problemas de las aplicaciones de Azure relativos a la carga de archivos cuando se ejecutan en el emulador de cálculo de Azure.

  3. Establezca los parámetros de filtro como se describe a continuación para el host del emulador de cálculo de Azure. Si va a solucionar los problemas con las aplicaciones de Azure que se ejecutan en un proyecto de rol de trabajador, cambie el filtro para mostrar las entradas con el nombre de proceso WaWorkerHost.exe en lugar de WaWebHost.exe.



    Captura de pantalla del Explorador de procesos



  4. Busque todos los mensajes NAME_NOT_FOUND. Esto ayudará a aislar el archivo de biblioteca que falta. Una vez que se ha determinado qué archivo falta puede restringir el ámbito de búsqueda aplicando un filtro para aislar solo los mensajes relacionados con ese archivo.

Para habilitar las aplicaciones de Azure para que ejecuten código nativo de 64 bits con P/Invoke, en primer lugar, se han de configurar los roles de trabajador o web con el nivel de plena confianza .NET. Para obtener más información sobre cómo llamar a código nativo de aplicaciones que se ejecutan en el trabajador de Azure o roles web, vea los recursos siguientes:

Esta sección describe el código de ejemplo en PinvokeCppCliInAzure.zip (http://go.microsoft.com/fwlink/p/?LinkId=236170), disponible para su descarga en http://azureunmanagedcode.codeplex.com/

noteNota
Cuando se utiliza el emulador de proceso de Azure desde Visual Studio para trabajar con el código de ejemplo, no es necesario ejecutar la parte del comando de inicio que instala las bibliotecas en tiempo de ejecución de Visual C++, por lo que es necesario convertir en comentario la línea siguiente en el archivo startup.cmd:

REM "%~dps0vcredist_x64.exe" /q /norestart

El código de ejemplo contiene un proyecto que crea una DLL nativa denominada ExampleNativeCode.dll. Se ha compilado como una biblioteca de 64 bits en modo de inicio como se recomienda.

noteNota
Salga y reinicie el emulador de cálculo de Azure cada vez que ejecute código de ejemplo en caso de que se efectúe algún cambio en el código o en las variables de entorno de Windows. De esta forma se asegurará de que cualquier código nativo referenciado se libera desde la memoria, con lo cual se puede volver a compilar, y de que el emulador de cálculo de Azure recopilará los cambios de la variable de entorno la próxima vez que se ejecute.

El código de ejemplo ExampleNativeCode.dll se encapsula con P/Invoke en un proyecto denominado ManagedUsingPinvoke y con C++/CLI en un proyecto denominado ManagedUsingCppCLI.

El código del DLL nativo es una versión modificada de la plantilla predeterminada del proyecto de Win32 con las exportaciones y contiene una sola función que responde a todas las preguntas conocidas en el universo, siempre que la respuesta a esas preguntas sea la cifra 42:

EXAMPLENATIVECODE_API int fnExampleNativeCode(void)
{
    return 42;
}

El código de P/Invoke y código de C++/CLI que utilizan esta función son muy similares:

P/Invoke

public class Class1
{
    [DllImport("ExampleNativeCode.dll")]
    static extern int fnExampleNativeCode();

    public int GetTheAnswerToEverything()
    {
        return fnExampleNativeCode();
    }
}

C++/CLI

public ref class Class1
{
public:

    int GetTheAnswerToEverything()
    {
        return fnExampleNativeCode();
    }
};

Ambos ejemplos de roles de trabajador (PInvokeWorkerRole y CppCliWorkerRole) en la solución invocan el código de la misma manera:

try
{
    Trace.WriteLine(new Class1().GetTheAnswerToEverything());
}
catch (Exception ex)
{
    Trace.WriteLine(ex);
}

Ambos ejemplos de rol de trabajador incluyen el código nativo compilado y se configuran para copiar siempre el código nativo compilado en el directorio de salida.

Cuando presiona F5 para ejecutar el código en el emulador de cálculo de Azure, debería aparecer el resultado siguiente:

Salida de la consola de código de muestra

Se aplican algunas consideraciones al llamar al código nativo desde las aplicaciones de Azure que se ejecutan en una instancia de rol web con respecto a cuando se ejecutan en una instancia de rol de trabajador. Los proyectos PInvokeWebRole y CppCliWebRole contienen el código siguiente en una versión ligeramente modificada de la plantilla predeterminada del proyecto de ASP.NET:

P/Invoke

<p>
    This is PInvoke <br />
        <%=Environment.GetEnvironmentVariable("PATH") %> <br />
        <%=new Class1().GetTheAnswerToEverything() %>
</p>

C++/CLI

<p>
    This is C++/CLI <br />
        <%=Environment.GetEnvironmentVariable("PATH") %> <br />
        <%=new Class1().GetTheAnswerToEverything() %>
</p>

Si se ejecuta el proyecto PInvokeWebRole se obtendrán los resultados esperados que son similares a lo siguiente:

Salida de la consola PInvoke a partir de código nativo

Sin embargo, al ejecutar el proyecto CppCliWebRole sin modificar se producirá el error siguiente:

Mensaje de error devuelto por el rol web
noteNota
Este error se produce incluso con las configuraciones correctas para el proyecto aplicadas a la copia del código nativo compilado en el directorio de salida.

Para solucionar este error, utilice uno de los métodos descritos en Ensure that Azure Applications Running in a Web Role Instance can Locate any Referenced Native Code. Después de utilizar uno de estos métodos, debería comprobar el resultado esperado para la página de CppCliWebRole, que es similar a lo siguiente:

Salida de la consola C++/CLI a partir de código nativo

Mostrar:
© 2015 Microsoft