在 Azure Cloud Services 上安裝 .NET (傳統) 角色

重要

雲端服務 (傳統) 現已為新客戶淘汰,並將于 2024 年 8 月 31 日針對所有客戶淘汰。 新的部署應該使用新的 Azure Resource Manager 部署模型 Azure Cloud Services (擴充) 。

本文說明如何安裝 Azure 客體作業系統.NET Framework的用戶端版本。 您可以在客體作業系統上使用 .NET 來設定雲端服務 Web 和員工角色。

例如,您可以在來賓 OS .NET Framework 4 安裝 4.6.2,這不會隨 4.6 版本.NET Framework一起提供。 (來賓 OS 系列 5 提供 4.6..NET Framework 4.6.) 有關 Azure 客體作業系統版本的最新資訊,請參閱 Azure 客體作業系統版本新聞

重要

Azure SDK 2.9 包含在來賓 OS .NET Framework 4 或更新版本部署 4.6 的限制。 Microsoft Docs 網站上提供限制的修正程式。

若要在您的 Web 和員工角色上安裝 .NET,請納入 .NET Web 安裝程式,做為雲端服務專案的一部分。 啟動安裝程式做為角色啟動工作的一部分。

新增 .NET 安裝程式至專案

若要下載網頁安裝程式.NET Framework,請選擇您想要安裝的版本:

若要新增網頁角色 的安裝程式

  1. 解決方案探索工具的[雲端服務專案中的角色> 下,以滑鼠右鍵按一下您的Web角色,然後選取[新增資料夾> 。 建立名為 bin 的資料夾
  2. 以滑鼠右鍵按一下 bin 資料夾,然後選取[新增現有專案。 選取 .NET 安裝程式,並新增到 bin 資料夾。

若要新增工作人員角色的 安裝程式

  • 以滑鼠右鍵按一下您的員工角色,然後選取[新增現有專案> 。 選取 .NET 安裝程式,並新增到角色。

當以這種方式將檔案新加到角色內容資料夾時,檔案會自動新加到您的雲端服務套件中。 然後,檔案會部署到虛擬機器上的一致位置。 針對雲端服務中的每個 Web 和工作人員角色重複此程式,讓所有角色都有安裝程式的複本。

注意

即使您的應用程式.NET Framework 4.6,您也應該在雲端服務角色上安裝 .NET Framework 4.6.2。 客體作業系統包含知識庫更新3098779和更新3097997。 如果您執行 .NET 應用程式時,.NET Framework知識庫更新的上方安裝 4.6 時發生問題。 若要避免這些問題,請.NET Framework 4.6.2 而非版本 4.6。 詳細資訊請參閱知識庫文章31187504340191。

Role contents with installer files

定義角色的啟動工作

您可以使用啟動工作在角色啟動前執行作業。 在啟動.NET Framework安裝應用程式代碼,可確保在執行任何應用程式代碼之前先安裝架構。 有關啟動工作的資訊,請參閱在 Azure 中執行啟動工作

  1. 新增下列內容至所有角色的 WebRoleWorkerRole 節點下的 ServiceDefinition.csdef 檔案:

    <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>
    

    上述組組會以系統管理員許可權執行主控台命令, install.cmd 以安裝.NET Framework。 此組組也會建立名為NETFXInstallLocalStorage元素。 啟動腳本會設定暫存檔案夾,以使用此本地儲存資源。

    重要

    若要確保正確安裝架構,請設定此資源的大小至少為 1,024 MB。

    有關啟動工作詳細資訊,請參閱常見的 Azure 雲端服務啟動工作

  2. 建立名為 install.cmd 的 檔案,並新增下列安裝腳本至檔案。

    腳本會查詢註冊表,.NET Framework檢查電腦上是否已安裝指定的版本。 如果未安裝.NET Framework,系統隨即開啟.NET Framework安裝程式。 為了協助疑難排解任何問題,腳本會記錄所有活動至儲存在 InstallLogs 本地儲存空間的檔案 (目前日期和時間) .txt。

    重要

    使用基本文字編輯器 ,Windows 記事本建立 install.cmd 檔案。 如果您使用 Visual Studio來建立文字檔,將副檔名變更為 .cmd,檔案可能仍然包含 UTF-8 位元組順序標記。 執行腳本的第一行時,此標記可能會導致錯誤。 若要避免此錯誤,請讓腳本的第一行成為 REM 語句,由位元組連續處理略過。

    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" ***** https://go.microsoft.com/fwlink/?LinkId=671729
    REM ***** To install .NET 4.6.2 set the variable netfx to "NDP462" ***** https://dotnet.microsoft.com/download/dotnet-framework/net462
    REM ***** To install .NET 4.7 set the variable netfx to "NDP47" ***** 
    REM ***** To install .NET 4.7.1 set the variable netfx to "NDP471" ***** https://go.microsoft.com/fwlink/?LinkId=852095
    REM ***** To install .NET 4.7.2 set the variable netfx to "NDP472" ***** https://go.microsoft.com/fwlink/?LinkId=863262
    set netfx="NDP472"
    REM ***** To install .NET 4.8 set the variable netfx to "NDP48" ***** https://dotnet.microsoft.com/download/thank-you/net48
    
    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%=="NDP472" goto NDP472
    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
    
    :NDP47
    set "netfxinstallfile=NDP47-KB3186500-Web.exe"
    set netfxregkey="0x707FE"
    goto logtimestamp
    
    :NDP471
    set "netfxinstallfile=NDP471-KB4033344-Web.exe"
    set netfxregkey="0x709fc"
    goto logtimestamp
    
    :NDP472
    set "netfxinstallfile=NDP472-KB4054531-Web.exe"
    set netfxregkey="0x70BF6"
    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%
        goto exit
    
    :restart
    echo Restarting to complete .NET (%netfx%) installation >> %startuptasklog%
    shutdown.exe /r /t 5 /c "Installed .NET framework" /f /d p:2:4
    
    :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. 如本主題前面所述,使用在解決方案管理器中新增現有專案,將 install.cmd 檔案新增到每個 角色。

    完成此步驟之後,所有角色都應該有 .NET 安裝程式檔案和 install.cmd 檔案。

    Role contents with all files

設定診斷以將開機記錄傳輸至 Blob 儲存空間

若要簡化安裝問題的疑難排解,您可以設定 Azure 診斷,將啟動腳本或 .NET 安裝程式產生的任何記錄檔案轉移到 Azure Blob 儲存空間。 使用這個方法,您可以從 Blob 儲存空間下載記錄檔案來查看記錄,而不必將遠端桌面下載到角色中。

若要設定診斷,請開啟 diagnostics.wadcfgx 檔案,在目錄節點下新增 下列 內容:

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

此 XML 會設定診斷,將 NETFXInstall 資源中記錄目錄中的檔案轉移到 netfx-install Blob 容器中的診斷儲存帳戶。

部署您的雲端服務

當您部署雲端服務時,啟動工作會安裝.NET Framework安裝尚未安裝的雲端服務。 安裝架構時,您的雲端服務角色會位於忙碌狀態。 如果架構安裝需要重新開機,服務角色可能也會重新開機。

其他資源