Esporta (0) Stampa
Espandi tutto

Procedure consigliate per l'esecuzione di codice non gestito nelle applicazioni Azure

Aggiornamento: giugno 2014

La scrittura di codice .NET per le applicazioni Azure è in gran parte uguale alla scrittura di codice .NET per le applicazioni Windows. Esistono differenze minime che è opportuno conoscere in caso di scrittura di codice .NET per una piattaforma rispetto all'altra. In questo documento vengono forniti suggerimenti per l'esecuzione di codice non gestito/nativo nelle applicazioni Azure.

Autori Christian Martinez, Trace Young e Mark Simms

Nelle sezioni seguenti vengono forniti suggerimenti per assicurare che il codice nativo funzioni correttamente in caso di sviluppo di applicazioni Azure che chiamano codice nativo.

Per configurare la compilazione del codice nativo modalità di rilascio, fare clic con il pulsante destro del mouse sul progetto di codice nativo, selezionare Proprietà per visualizzare la pagina Proprietà, quindi seleziona l'opzione di configurazione Release disponibile nella scheda Compila della pagina delle proprietà:

Opzione di compilazione della modalità di rilascio delle proprietà di progetto

noteNota
Errori di run-time indicanti che mancano DLL come msvcr100d.dll o msvcp100d.dll significano che il codice nativo distribuito è stato compilato in modalità di debug. I file msvcr100d.dll e il msvcp100d.dll non sono DLL ridistribuibili. Per ulteriori informazioni su come determinare i file DLL di C++ da ridistribuire, vedere Determinazione delle DLL da ridistribuire (http://go.microsoft.com/fwlink/p/?LinkId=236016).

Per assicurarsi che il codice nativo possa essere individuato dall'applicazione Azure sia in grado di individuare qualsiasi codice nativo eseguito nell'emulatore di calcolo di Azure, procedere come indicato di seguito:

  1. Impostare le proprietà appropriate per i file di codice nativo compilati in Visual Studio

    Includere il file di codice nativo file compilato come elemento del progetto e nella finestra di dialogo Proprietà del file impostare l'opzione Copia nella directory di output su Copia sempre e l'opzione Azione di compilazione su Nessuno.

    In questo modo il file del codice nativo compilato verrà copiato nella directory \bin, assicurando che l'applicazione Azure sarà in grado di individuare il file di codice nativo file compilato quando viene eseguito nell'emulatore di calcolo di Azure.



    Finestra di dialogo Azioni di compilazione codice non gestito
  2. Nel caso di risoluzione dei problemi relativi all'implementazione di RoleEntry nell'emulatore di calcolo di Azure può risultare più facile eseguire il debug dei problemi se si copia il file del codice nativo compilato nella directory di runtime devfabric

    • Quando ad esempio si utilizza Azure SDK versione 1.5 o precedente, copiare il file di codice nativo compilato nella directory seguente:


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


    • In alternativa, quando si usa Azure SDK 1.6 o versioni successive, copiare il file di codice nativo compilato in questa directory:


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

  3. Assicurarsi che le applicazioni Azure in esecuzione in un'istanza di ruolo Web siano in grado di individuare l'eventuale codice nativo a cui viene fatto riferimento

    Se un'applicazione Azure fa riferimento al codice nativo di cui è stato eseguito il wrapping tramite C++/CLI e l'applicazione Azure viene eseguita in un'istanza di ruolo Web, usare uno dei metodi seguenti per assicurarsi che l'applicazione Azure sia in grado di individuare il codice nativo a cui viene fatto riferimento:



    noteNota
    Le procedure seguenti si riferiscono al progetto CppCliWebRole incluso nel codice di esempio in PinvokeCppCliInAzure.zip, disponibile per il download all'indirizzo http://azureunmanagedcode.codeplex.com/. Per altre informazioni sul codice di esempio, vedere Codice di esempio: Esecuzione di codice nativo da applicazioni di Azure.

    Metodo 1: Modificare la variabile di ambiente PATH, quindi riavviare l'emulatore di calcolo di Azure e IIS:

    1. Arrestare e uscire dall'emulatore di calcolo di Azure.

    2. Modificare la variabile di ambiente PATH in modo che punti a una directory contenente il codice nativo compilato.

    3. Digitare iisreset a un prompt dei comandi con privilegi elevati.

    4. Premere F5 per eseguire il codice di esempio.

    Metodo 2: Usare un comando di avvio

    Nei passaggi seguenti il codice nativo è incluso nel file ExampleNativeCode.dll.

    1. Arrestare e uscire dall'emulatore di calcolo di Azure.

    2. Aprire il file indist.cmd incluso nel progetto CppCliWebRole.

    3. Modificare la riga seguente:

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



      copy "%~dps0ExampleNativeCode.dll" "%windir%\system32\inetsrv"
      
    4. Salvare il progetto.

    5. Premere F5 per eseguire il codice di esempio.

    noteNota
    L'utilizzo di un comando di avvio funziona anche per le distribuzioni effettive. Se si preferisce evitare riferimenti alla directory di sistema di IIS, in alternativa è possibile creare ed eseguire uno script per:

    1. Modificare la variabile di ambiente PATH in modo che punti alla directory contenente il codice nativo compilato.

    2. Riavviare IIS e qualsiasi processo dipendente.

Azure è una piattaforma a 64 bit, come lo sono anche gli host dell'applicazione Azure (ruolo Web e di lavoro). Se non si utilizza un ambiente di sviluppo a 64 bit puro e l'applicazione fa riferimento codice nativo, verranno generati errori. Un test semplice per verificare che tutto il codice nativo a cui viene fatto riferimento sia a 64 bit, consiste nel testarlo utilizzando applicazioni di test della console che sono hardcoded per essere eseguite come applicazioni a 64 bit.

Per impostazione predefinita, solo le librerie di runtime di Visual C++ per Visual C++ 2008 vengono installate nei ruoli Web e di lavoro in Azure. Il codice nativo compilato in base alla libreria di runtime di Visual C++ per altre versioni di Visual C++ non verrà pertanto caricato nelle istanze dei ruoli Web e di lavoro. Se nello stesso computer sono installati sia Visual Studio 2008 sia una versione successiva, sarà possibile utilizzare la funzionalità multitargeting nativa di Visual Studio per compilare librerie native per l'applicazione in uso con il set di strumenti (compilatore, linker, intestazioni e librerie) della piattaforma Visual Studio 2008. Per altre informazioni sull'uso di Visual Studio per compilare un'applicazione con il set di strumenti della piattaforma Visual Studio 2008, vedere Procedura: modificare il framework di destinazione e il set di strumenti della piattaforma(http://go.microsoft.com/fwlink/?LinkId=324964).

È possibile aggiungere un'attività di avvio con privilegi elevati al progetto di ruolo di lavoro o Web per copiare e installare la versione richiesta delle librerie di runtime. Nei passaggi seguenti viene descritto come creare un'attività di avvio con privilegi elevati per copiare la versione a 64 bit di Microsoft Visual C++ 2010 Redistributable Package in un ruolo Web/di lavoro ed eseguire il pacchetto ridistribuibile per installare le librerie Visual C++ per Visual C++ 2010 nelle istanze dei ruoli Web/di lavoro. Altre versioni di Visual C++ richiederanno un pacchetto distribuibile specifico di tale versione:

  1. Creare una cartella di avvio per il progetto di ruolo Web o di lavoro.

  2. Copiare vcredist_x64.exe (http://go.microsoft.com/fwlink/p/?LinkId=225987) nella cartella di avvio.

  3. Creare un file startup.cmd nella cartella di avvio.

  4. Modificare startup.cmd e aggiungere la riga seguente:


    "%~dps0vcredist_x64.exe" /q /norestart


  5. Modificare le proprietà di vcredit_x64.exe e startup.cmd da Esplora soluzioni di Visual Studio. Impostare l'opzione Azione di compilazione su Contenuto e l'opzione Copia nella directory di output su Copia se più recente.

  6. Modificare il file ServiceDefinition.csdef per il ruolo aggiungendo la seguente attività di avvio con privilegi elevati per eseguire startup.cmd:


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

Il messaggio di errore generato quando un assembly non può essere caricato dall'emulatore di calcolo di Azure potrebbe essere non-intuitivo. Per risolvere i problemi relativi al caricamento di file nell'istanza host di un ruolo Web o di lavoro, utilizzare Process Monitor come segue:

  1. Scaricare lo strumento di monitoraggio dei processi dalla pagina Process Monitor v2.96 (http://go.microsoft.com/fwlink/p/?LinkID=137175).

  2. Avviare lo strumento di monitoraggio dei processi risolvere i problemi relativi al caricamento di file delle applicazioni Azure eseguite nell'emulatore di calcolo di Azure.

  3. Impostare i parametri del filtro come raffigurato di seguito per l'host dell'emulatore di calcolo di Azure. Nel caso di risoluzione dei problemi relativi alle applicazioni Azure eseguite in un progetto di ruolo di lavoro, modificare il filtro per visualizzare le voci con nome di processo WaWorkerHost.exe anziché WaWebHost.exe.



    Schermata della scheda Esplora processo



  4. Cercare qualsiasi messaggio NAME_NOT_FOUND. In questo modo sarà più facile isolare il file di libreria mancanti. Dopo aver determinato il file mancante, sarà possibile limitare l'ambito della ricerca applicando un filtro per isolare solo messaggi correlati a quel file.

Per abilitare le applicazioni Azure all'esecuzione di codice nativo a 64 bit utilizzando P/Invoke, configurare innanzitutto i ruoli Web o di lavoro associati con il livello di attendibilità totale di .NET. Per ulteriori informazioni sulla chiamata di codice nativo da applicazioni eseguite in ruoli Web o di lavoro di Azure, vedere le risorse seguenti:

In questa sezione viene descritto il codice di esempio incluso in PinvokeCppCliInAzure.zip (http://go.microsoft.com/fwlink/p/?LinkId=236170), disponibile per il download all'indirizzo http://azureunmanagedcode.codeplex.com/

noteNota
In caso venga utilizzato l'emulatore di calcolo di Azure da Visual Studio per utilizzare il codice di esempio, non è necessario eseguire la parte del comando di avvio che consente di installare le librerie di runtime di Visual C++, pertanto dovrà impostare come commento la riga seguente nel file startup.cmd:

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

Il codice di esempio contiene un progetto che crea una DLL nativa denominata ExampleNativeCode.dll. La compilazione è stata eseguita come libreria a 64 bit in modalità di rilascio come consigliato.

noteNota
Uscire dall'emulatore di calcolo di Azure e riavviarlo ogni volta che si esegue codice di esempio se vengono apportate modifiche al codice o alle variabili di ambiente di Windows. In questo modo si assicurerà che qualsiasi codice nativo a cui viene fatto riferimento venga rilasciato dalla memoria in modo che possa essere ricompilato e che qualsiasi modifica alle variabili di ambiente venga rilevata dall'emulatore di calcolo di Azure alla successiva esecuzione.

Il codice di esempio ExampleNativeCode.dll viene sottoposto a wrapping tramite P/Invoke in un progetto denominato ManagedUsingPinvoke e sottoposto al wrapping tramite C++/CLI in un progetto denominato ManagedUsingCppCLI.

Il codice nella DLL nativa è una versione modificata del modello di progetto Win32 predefinito con esportazioni e contiene una singola funzione che risponde a tutte le domande note possibili, a condizione che la risposta a tali domande sia la numero 42:

EXAMPLENATIVECODE_API int fnExampleNativeCode(void)
{
    return 42;
}

Il codice di P/Invoke e il codice C++/CLI codice che utilizzano questa funzione sono molto simili:

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();
    }
};

Entrambi gli esempi del ruolo di lavoro (PInvokeWorkerRole e CppCliWorkerRole) nella soluzione richiamano il codice nello stesso modo:

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

Entrambi gli esempi del ruolo di lavoro includono il codice nativo compilato e sono configurati per copiare sempre il codice nativo compilato nella directory di output.

Quando si preme F5 per eseguire il codice nell'emulatore di calcolo di Azure dovrebbe essere visualizzato l'output seguente:

Output della console per il codice di esempio

Alcune considerazioni sono applicabili quando si chiama il codice nativo da applicazioni Azure in esecuzione in un'istanza del ruolo Web rispetto a quando sono in esecuzione in un'istanza del ruolo di lavoro. I progetti PInvokeWebRole e CppCliWebRole contengono il codice seguente in una versione leggermente modificata del modello di progetto ASP.NET predefinito:

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>

L'esecuzione del PInvokeWebRole restituirà l'output previsto simile al seguente:

Output della console PInvoke dal codice nativo

L'esecuzione del progetto CppCliWebRole senza modifica restituirà tuttavia l'errore seguente:

Messaggio di errore restituito dal ruolo Web
noteNota
L'errore si verifica anche quando vengono applicate le impostazioni del progetto appropriate per copiare il codice nativo compilato nella directory di output.

Per correggere questo errore, usare uno dei metodi illustrati in Ensure that Azure Applications Running in a Web Role Instance can Locate any Referenced Native Code. Dopo avere utilizzato uno di questi metodi dovrebbe essere visualizzato l'output previsto per la pagina CppCliWebRole, simile al seguente:

Output della console C++/CLI dal codice nativo

Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2015 Microsoft