Installare .NET nei ruoli di Servizi cloud di AzureInstall .NET on Azure Cloud Services roles

Questo articolo illustra come installare versioni di .NET Framework non incluse nel sistema operativo guest di Azure.This article describes how to install versions of .NET Framework that don't come with the Azure Guest OS. È possibile usare .NET nel sistema operativo guest per configurare i ruoli Web e di lavoro del servizio cloud.You can use .NET on the Guest OS to configure your cloud service web and worker roles.

Ad esempio, è possibile installare .NET 4.6.1 nella famiglia di sistemi operativi guest 4, non disponibile in nessuna versione di .NET 4.6.For example, you can install .NET 4.6.1 on the Guest OS family 4, which doesn't come with any release of .NET 4.6. La famiglia di sistemi operativi guest 5 è inclusa in .NET 4.6. Per le informazioni più recenti sulle versioni del sistema operativo guest di Azure, vedere Novità sulle versioni del sistema operativo guest di Azure.(The Guest OS family 5 does come with .NET 4.6.) For the latest information on the Azure Guest OS releases, see the Azure Guest OS release news.

Importante

Azure SDK 2.9 contiene una restrizione relativa alla distribuzione di .NET 4.6 nella famiglia di sistemi operativi guest 4 o versioni precedenti.The Azure SDK 2.9 contains a restriction on deploying .NET 4.6 on the Guest OS family 4 or earlier. Nel sito di Microsoft Docs è disponibile una correzione alla restrizione.A fix for the restriction is available on the Microsoft Docs site.

Per installare .NET nei ruoli Web e di lavoro, includere il programma di installazione Web di .NET come parte del progetto di servizio cloud.To install .NET on your web and worker roles, include the .NET web installer as part of your cloud service project. Avviare il programma di installazione come parte delle attività di avvio del ruolo.Start the installer as part of the role's startup tasks.

Aggiungere al progetto il programma di installazione .NETAdd the .NET installer to your project

Per scaricare il programma di installazione Web per .NET Framework, scegliere la versione da installare:To download the web installer for the .NET Framework, choose the version that you want to install:

Per aggiungere il programma di installazione per un ruolo Web:To add the installer for a web role:

  1. In Ruoli del progetto di servizio cloud in Esplora soluzioni fare clic con il pulsante destro del mouse sul ruolo Web e scegliere Aggiungi > Nuova cartella.In Solution Explorer, under Roles in your cloud service project, right-click your web role and select Add > New Folder. Creare una cartella denominata bin.Create a folder named bin.
  2. Fare clic con il pulsante destro del mouse sulla cartella bin e scegliere Aggiungi > Elemento esistente.Right-click the bin folder and select Add > Existing Item. Selezionare il programma di installazione .NET e aggiungerlo alla cartella bin.Select the .NET installer and add it to the bin folder.

Per aggiungere il programma di installazione per un ruolo di lavoro:To add the installer for a worker role:

  • Fare clic con il pulsante destro del mouse sul ruolo di lavoro e scegliere Aggiungi > Elemento esistente.Right-click your worker role and select Add > Existing Item. Selezionare il programma di installazione .NET e aggiungerlo al ruolo.Select the .NET installer and add it to the role.

I file aggiunti in questo modo alla cartella di contenuto del ruolo vengono aggiunti automaticamente al pacchetto del servizio cloud.When files are added in this way to the role content folder, they're automatically added to your cloud service package. I file vengono quindi distribuiti in una posizione analoga nella macchina virtuale.The files are then deployed to a consistent location on the virtual machine. Ripetere questo processo per tutti i ruoli Web e di lavoro nel servizio cloud, in modo che tutti i ruoli abbiano una copia del programma di installazione.Repeat this process for each web and worker role in your cloud service so that all roles have a copy of the installer.

Nota

Anche se l'applicazione è destinata a .NET 4.6, è necessario installare .NET 4.6.1 nel ruolo del servizio cloud.You should install .NET 4.6.1 on your cloud service role even if your application targets .NET 4.6. Il sistema operativo guest include l'aggiornamento 3098779 e l'aggiornamento 3097997 della Knowledge Base.The Guest OS includes the Knowledge Base update 3098779 and update 3097997. Se .NET 4.6 viene installato sugli aggiornamenti della Knowledge Base, possono verificarsi problemi durante l'esecuzione delle applicazioni .NET.Issues can occur when you run your .NET applications if .NET 4.6 is installed on top of the Knowledge Base updates. Per evitare tali problemi, installare .NET 4.6.1 anziché la versione 4.6.To avoid these issues, install .NET 4.6.1 rather than version 4.6. Per altre informazioni, vedere l'articolo 3118750 della Knowledge Base.For more information, see the Knowledge Base article 3118750.

Contenuto del ruolo con i file del programma di installazione

Definire le attività di avvio per i ruoliDefine startup tasks for your roles

È possibile usare le attività di avvio per eseguire operazioni prima dell'avvio di un ruolo.You can use startup tasks to perform operations before a role starts. Per assicurarsi che il framework venga installato prima di eseguire qualsiasi codice dell'applicazione, installare .NET Framework come parte dell'attività di avvio.Installing the .NET Framework as part of the startup task ensures that the framework is installed before any application code is run. Per altre informazioni sulle attività di avvio, vedere Eseguire attività di avvio in Azure.For more information on startup tasks, see Run startup tasks in Azure.

  1. Aggiungere il contenuto seguente al file ServiceDefinition.csdef nel nodo WebRole o WorkerRole per tutti i ruoli:Add the following content to the ServiceDefinition.csdef file under the WebRole or WorkerRole node for all roles:

    <LocalResources>
      <LocalStorage name="NETFXInstall" sizeInMB="1024" cleanOnRoleRecycle="false" />
    </LocalResources>    
    <Startup>
      <Task commandLine="install.cmd" executionContext="elevated" taskType="simple">
        <Environment>
          <Variable name="PathToNETFXInstall">
            <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='NETFXInstall']/@path" />
          </Variable>
          <Variable name="ComputeEmulatorRunning">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
        </Environment>
      </Task>
    </Startup>
    

    La configurazione precedente esegue il comando install.cmd della console con privilegi di amministratore per installare .NET Framework.The preceding configuration runs the console command install.cmd with administrator privileges to install the .NET Framework. La configurazione crea anche un elemento LocalStorage con nome NETFXInstall.The configuration also creates a LocalStorage element named NETFXInstall. Lo script di avvio imposta la cartella temporanea per l'uso di questa risorsa di archiviazione locale.The startup script sets the temp folder to use this local storage resource.

    Importante

    Perché il framework venga installato correttamente, impostare le dimensioni della risorsa su almeno 1.024 MB.To ensure correct installation of the framework, set the size of this resource to at least 1,024 MB.

    Per altre informazioni sulle attività di avvio, vedere Attività di avvio comuni del servizio cloud.For more information about startup tasks, see Common Azure Cloud Services startup tasks.

  2. Creare un file denominato install.cmd e aggiungere al file lo script di installazione seguente.Create a file named install.cmd and add the following install script to the file.

    Lo script verifica se la versione di .NET Framework specificata è già installata nel computer eseguendo una query sul registro.The script checks whether the specified version of the .NET Framework is already installed on the machine by querying the registry. Se la versione di .NET non è installata, viene avviato il programma di installazione Web di .NET.If the .NET version is not installed, then the .NET web installer is opened. Per consentire la risoluzione di eventuali problemi, lo script registra tutte le attività in un file denominato startuptasklog-(data e ora corrente).txt memorizzato nell'archiviazione locale InstallLogs.To help troubleshoot any issues, the script logs all activity to the file startuptasklog-(current date and time).txt that is stored in InstallLogs local storage.

    Importante

    Usare un editor di testo di base, come Blocco note di Windows, per creare il file install.cmd.Use a basic text editor like Windows Notepad to create the install.cmd file. Se si usa Visual Studio per creare un file di testo e si modifica l'estensione in cmd, il file potrebbe ancora contenere un byte order mark UTF-8.If you use Visual Studio to create a text file and change the extension to .cmd, the file might still contain a UTF-8 byte order mark. Il byte order mark può provocare un errore quando viene eseguita la prima riga dello script.This mark can cause an error when the first line of the script is run. Per evitare questo errore, creare la prima riga dello script come istruzione REM che possa essere ignorata dall'elaborazione dell'ordine dei byte.To avoid this error, make the first line of the script a REM statement that can be skipped by the byte order processing.

    REM Set the value of netfx to install appropriate .NET Framework. 
    REM ***** To install .NET 4.5.2 set the variable netfx to "NDP452" *****
    REM ***** To install .NET 4.6 set the variable netfx to "NDP46" *****
    REM ***** To install .NET 4.6.1 set the variable netfx to "NDP461" *****
    REM ***** To install .NET 4.6.2 set the variable netfx to "NDP462" *****
    REM ***** To install .NET 4.7 set the variable netfx to "NDP47" *****
    REM ***** To install .NET 4.7.1 set the variable netfx to "NDP47" *****
    set netfx="NDP471"
    
    REM ***** Set script start timestamp *****
    set timehour=%time:~0,2%
    set timestamp=%date:~-4,4%%date:~-10,2%%date:~-7,2%-%timehour: =0%%time:~3,2%
    set "log=install.cmd started %timestamp%."
    
    REM ***** Exit script if running in Emulator *****
    if %ComputeEmulatorRunning%=="true" goto exit
    
    REM ***** Needed to correctly install .NET 4.6.1, otherwise you may see an out of disk space error *****
    set TMP=%PathToNETFXInstall%
    set TEMP=%PathToNETFXInstall%
    
    REM ***** Setup .NET filenames and registry keys *****
    if %netfx%=="NDP471" goto NDP471
    if %netfx%=="NDP47" goto NDP47
    if %netfx%=="NDP462" goto NDP462
    if %netfx%=="NDP461" goto NDP461
    if %netfx%=="NDP46" goto NDP46
        set "netfxinstallfile=NDP452-KB2901954-Web.exe"
        set netfxregkey="0x5cbf5"
        goto logtimestamp
    
    :NDP46
    set "netfxinstallfile=NDP46-KB3045560-Web.exe"
    set netfxregkey="0x6004f"
    goto logtimestamp
    
    :NDP461
    set "netfxinstallfile=NDP461-KB3102438-Web.exe"
    set netfxregkey="0x6040e"
    goto logtimestamp
    
    :NDP462
    set "netfxinstallfile=NDP462-KB3151802-Web.exe"
    set netfxregkey="0x60632"
    goto logtimestamp
    
    :NPD47
    set "netfxinstallfile=NDP47-KB3186500-Web.exe"
    set netfxregkey="0x707FE"
    goto logtimestamp
    
    :NDP471
    set "netfxinstallfile=NDP471-KB4033344-Web.exe"
    set netfxregkey="0x709fc"
    goto logtimestamp
    
    :logtimestamp
    REM ***** Setup LogFile with timestamp *****
    md "%PathToNETFXInstall%\log"
    set startuptasklog="%PathToNETFXInstall%log\startuptasklog-%timestamp%.txt"
    set netfxinstallerlog="%PathToNETFXInstall%log\NetFXInstallerLog-%timestamp%"
    echo %log% >> %startuptasklog%
    echo Logfile generated at: %startuptasklog% >> %startuptasklog%
    echo TMP set to: %TMP% >> %startuptasklog%
    echo TEMP set to: %TEMP% >> %startuptasklog%
    
    REM ***** Check if .NET is installed *****
    echo Checking if .NET (%netfx%) is installed >> %startuptasklog%
    set /A netfxregkeydecimal=%netfxregkey%
    set foundkey=0
    FOR /F "usebackq skip=2 tokens=1,2*" %%A in (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release 2^>nul`) do @set /A foundkey=%%C
    echo Minimum required key: %netfxregkeydecimal% -- found key: %foundkey% >> %startuptasklog%
    if %foundkey% GEQ %netfxregkeydecimal% goto installed
    
    REM ***** Installing .NET *****
    echo Installing .NET with commandline: start /wait %~dp0%netfxinstallfile% /q /serialdownload /log %netfxinstallerlog%  /chainingpackage "CloudService Startup Task" >> %startuptasklog%
    start /wait %~dp0%netfxinstallfile% /q /serialdownload /log %netfxinstallerlog% /chainingpackage "CloudService Startup Task" >> %startuptasklog% 2>>&1
    if %ERRORLEVEL%== 0 goto installed
        echo .NET installer exited with code %ERRORLEVEL% >> %startuptasklog%    
        if %ERRORLEVEL%== 3010 goto restart
        if %ERRORLEVEL%== 1641 goto restart
        echo .NET (%netfx%) install failed with Error Code %ERRORLEVEL%. Further logs can be found in %netfxinstallerlog% >> %startuptasklog%
    
    :restart
    echo Restarting to complete .NET (%netfx%) installation >> %startuptasklog%
    EXIT /B %ERRORLEVEL%
    
    :installed
    echo .NET (%netfx%) is installed >> %startuptasklog%
    
    :end
    echo install.cmd completed: %date:~-4,4%%date:~-10,2%%date:~-7,2%-%timehour: =0%%time:~3,2% >> %startuptasklog%
    
    :exit
    EXIT /B 0
    
  3. Aggiungere il file install.cmd a ogni ruolo tramite Aggiungi > Elemento esistente in Esplora soluzioni, come descritto in precedenza in questo argomento.Add the install.cmd file to each role by using Add > Existing Item in Solution Explorer as described earlier in this topic.

    Al termine, tutti i ruoli avranno a disposizione il file del programma di installazione di .NET e il file install.cmd.After this step is complete, all roles should have the .NET installer file and the install.cmd file.

    Contenuto del ruolo con tutti i file

Configurare la diagnostica per trasferire i log di avvio nell'archivio BLOBConfigure Diagnostics to transfer startup logs to Blob storage

Per semplificare la risoluzione dei problemi di installazione, è possibile configurare Diagnostica di Azure per trasferire i file di log generati dallo script di avvio o dal programma di installazione di .NET nell'archivio BLOB di Azure.To simplify troubleshooting installation issues, you can configure Azure Diagnostics to transfer any log files generated by the startup script or the .NET installer to Azure Blob storage. Con questo approccio è possibile visualizzare i log scaricando i file di log dall'archivio BLOB anziché collegandosi al ruolo tramite desktop remoto.By using this approach, you can view the logs by downloading the log files from Blob storage rather than having to remote desktop into the role.

Per configurare la diagnostica, aprire il diagnostics.wadcfgx e aggiungere il contenuto seguente al nodo Directory:To configure Diagnostics, open the diagnostics.wadcfgx file and add the following content under the Directories node:

<DataSources>
 <DirectoryConfiguration containerName="netfx-install">
  <LocalResource name="NETFXInstall" relativePath="log"/>
 </DirectoryConfiguration>
</DataSources>

Questo codice XML permette di configurare Diagnostica di Azure per il trasferimento di tutti i file presenti nella directory dei log della risorsa NETFXInstall nell'account di archiviazione di Diagnostica nel contenitore BLOB netfx-install.This XML configures Diagnostics to transfer the files in the log directory in the NETFXInstall resource to the Diagnostics storage account in the netfx-install blob container.

Distribuire il servizio cloudDeploy your cloud service

Quando si distribuisce il servizio cloud, le attività di avvio installano .NET Framework, se non è già installato.When you deploy your cloud service, the startup tasks install the .NET Framework if it's not already installed. Durante l'installazione del framework, i ruoli dei servizi cloud sono in stato occupato.Your cloud service roles are in the busy state while the framework is being installed. Se l'installazione del framework richiede un riavvio, potrebbero essere riavviati anche i ruoli del servizio.If the framework installation requires a restart, the service roles might also restart.

Risorse aggiuntiveAdditional resources