共用方式為


Windows Installer 部署疑難排解

更新:2007 年 11 月

本章節將說明您在建立部署專案與部署應用程式時,可能會遭遇的各種問題。

安裝於當地語系非英文之電腦時,MFC 應用程式並未予以當地語系化

使用 Visual Studio 部署專案部署 MFC 應用程式時,並不會偵測已當地語系化之合併模組 Mfc_loc_e.msm 與 Mfc_loc_fe.msm 的相依性。合併模組包含在 Visual C++ 中,預設的安裝位置是 \Program File\Common\Merge Modules。為了散發已當地語系化的 MFC 應用程式,您必須手動將這兩個合併模組加入至部署專案中。如需詳細資訊,請參閱部署和相依性

沒有偵測到組件相依性

當專案輸出群組、組件或合併模組加入至部署專案時,系統會自動偵測任何相依的組件,並將其加入至專案中。如果相依組件是在執行階段透過程式碼載入,部署工具就無法偵測出該組件。您應該盡可能避免由程式碼載入組件,或是手動將相依組件加入至部署專案中。如需詳細資訊,請參閱部署和相依性

安裝後無法在 Web 伺服器上找到檔案

將「Web 安裝」安裝至 Web 伺服器時,Web 應用程式資料夾與任何 Web 自訂資料夾的 [VirtualDirectory] 屬性會決定這些資料夾中的檔案將安裝至 Web 根目錄的相對位置。如果屬性是空白的,則檔案會安裝至 Web 根資料夾 (inetpub\wwwroot)。如需詳細資訊,請參閱 VirtualDirectory 屬性

如何將 Web 應用程式安裝至 Web 伺服器根目錄?

根據預設,使用「Web 安裝」部署專案安裝 Web 應用程式時,檔案會直接安裝在 Web 根資料夾之下的一個資料夾中,其名稱與部署專案相同。Web 應用程式資料夾的 [VirtualDirectory] 屬性決定了檔案的安裝位置。若要安裝至 Web 根目錄,請將 [VirtualDirectory] 屬性變更為 null (刪除預設值)。如需詳細資訊,請參閱 VirtualDirectory 屬性

無法偵錯使用 Xcopy 命令所部署的 Web 應用程式

若 Web 應用程式是以 Xcopy 命令複製到 Web 伺服器中,系統不會自動為您的應用程式設定網際網路資訊服務 (IIS)。偵錯功能無法執行是因為系統並未將應用程式資料夾視為應用程式的根目錄。

複製之後,您需要使用 IIS 管理員,將新的資料夾設定為應用程式的根目錄。此外,您應設定應用程式 Bin 資料夾的權限,以免 DLL 檔被下載。

秘訣

與其使用 Xcopy 命令,不如考慮使用 [複製專案] 命令或是 Web 安裝部署專案。如需詳細資訊,請參閱 其他部署

如何關閉相依性分析?

不幸的是,目前沒有直接的方式可關閉相依性分析搜尋和解析。不過,仍有一個解決方法,您可以在按一下 [SearchPath] 屬性時出現的對話方塊中,清除 [包含標準搜尋路徑] 選項。

另外還有一些重點需要考慮:

  • 您必須使用 [加入檔案] 命令加入檔案 (從 [專案] 功能表選取 [加入],然後按一下 [檔案])。如果您使用 [加入專案輸出] (從 [專案] 功能表選取 [加入],然後按一下 [專案輸出]),就會加入從程式碼專案回報的相依性。

  • 在建置時,您可能會看見一個或多個 [找不到相依性] 的警告,不過在此情況下可予以忽略。

  • 如果您只想要關閉某些檔案的相依性分析,您可以將這些檔案放置在關閉標準搜尋路徑的合併模組專案中。然後,請使用 [加入合併模組] (從 [專案] 功能表選取 [加入],然後按一下 [加入合併模組]),將 .msm 包含在開啟標準搜尋路徑的一般安裝專案中。

如何關閉預期使用者會修改或刪除之檔案的修復?

Visual Studio 會建立通告的捷徑,如此一來,當程式啟動時就會驗證所有檔案是否存在。若要變更這個行為,並使其不修復檔案,請選取安裝專案中的檔案,並將 [Condition] 屬性變更為 [NOT REINSTALL],如此檔案在修復時便不會重新安裝,而且其 [Transitive] 屬性會設定為 [TRUE],這樣便會重新評估條件。如此會讓 Installer 在第一次刪除檔案後於螢幕上短暫出現,同時它會驗證不應該重新安裝該檔案,不過之後您就不會看見 Installer 了。

如何偵錯自訂動作/Installer 類別?

您可以使用下列任何一項方法:

  • 在程式碼中,加入 System.Diagnostics.Debugger.Launch 的呼叫。這個方法會開啟 Just-In-Time 偵錯,並讓您將新的偵錯工具附加至程式碼中。

  • 在程式碼中,加入 MessageBox.Show("Debug Me") 的呼叫。當此訊息方塊出現時,請使用 Visual Studio 附加至 MessageBox 處理序。然後,請在程式碼中加入 break (Visual C# 專案) 或 stop (Visual Basic 專案)。

  • 設定您的偵錯偏好設定來啟動 InstallUtil.exe (位於 \winnt\Microsoft.net\Framework\version),然後將組件當做參數傳遞給它。當您按下 F5 時,就會叫用中斷點。InstallUtil.exe 將會執行自訂動作,就如同 MSI 的執行方式一樣。

向 COM 介面註冊組件沒有作用

這是已知的 RegAsm Bug。如果您的組件有相依性 (例如與另一個類別庫 (Class Library) 有相依性),則會因為系統呼叫 RegAsm 以取得註冊資訊,而可能導致 RegisterCOM 無法運作。由於 RegAsm 是在 \obj 目錄中呼叫的,所以找不到相依性,而且 RegAsm 會失敗而沒有任何告知。最佳的解決方法是手動從 \bin 目錄加入組件。另一個解決方法是使用 RegisterSelfReg。

此外,請確定您是使用 RegAsm/Codebase 手動註冊組件。如果您的組件不在共用位置中,除非它與呼叫程式碼位於相同的目錄,否則就找不到該組件。/Codebase 會將目錄輸入登錄中。

如何使用記錄檔疑難排解 Windows Installer 安裝問題?

Windows Installer 會將安裝程式時的作業記錄在記錄檔中。此記錄檔位於 .msi 檔所在的目錄中。

如何取得安裝的記錄檔?

有兩個方式:

  • 從命令列執行下列命令,並使用記錄參數。

    misexec /i mysetup.msi /l*v mylog.txt
    
  • 將下列文字儲存成 .reg 檔並載入登錄中。

    REGEDIT4
    
    [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer]
    "Logging"="voicewarmup"
    "Debug"=dword:00000007
    

    然後開啟您的 \temp 目錄並依日期排序。最近的 msi*.log 檔就是來自最近安裝或解除安裝的記錄。

如何將產品安裝至先前安裝之產品的子目錄中?

  1. 假設先前安裝的產品 Product 1 已安裝,而且含有名為 MyFile.txt 的檔案。

  2. 使用 ORCA (從 Windows Installer SDK) 檢視檔案表,然後找出表示 MyFile.txt 的資料列。

  3. 取得 Component_ column 的值,然後開啟 [元件資料表]。

  4. 在 [元件資料表] 中,找出 Component 資料行中含有 Component_ value 的資料列,並取得 ComponentID。將此值複製到 [剪貼簿] 中。接著關閉 ORCA。

  5. 在您的安裝專案中,開啟 [啟動條件編輯器],並加入 Windows Installer 元件搜尋。針對新搜尋的 [ComponentID] 屬性,貼上 ComponentID。

  6. 複製 [Property] 屬性。它應該看起來像 COMPONENTEXISTS1。

  7. 開啟 [檔案系統編輯器] 並選取 [應用程式資料夾]。

  8. 將 [DefaultLocation] 屬性編輯成如同 [COMPONENTEXISTS1]MySubFolder (由於 COMPONENTEXISTS1 中的路徑結尾含有 '\')。

在上個程序的步驟 6 之後,您可能會想要將條件加入至 [啟動條件編輯器],以便查看是否找到此元件;並在找不到時封鎖安裝及顯示訊息。此條件應該是 COMPONENTEXISTS1 (這表示如果 COMPONENTEXISTS1 不是空的,便可以執行 Installer)。

如何將自訂 Web 資料夾安裝至非預設的通訊埠?

若要將自訂的 Web 資料夾安裝到不是預設指定的通訊埠,請從命令列執行安裝。此命令必須包含每個 Web 自訂資料夾的 [Property] 屬性值,通常值會類似 NEWWEBPROPERTY1。此外,您也必須加入 Web 應用程式資料夾的 TARGETPORT。

例如,如果您的 Web 伺服器使用通訊埠 20,您的命令列看起來應該如下:

msiexec /i mywebsetup.msi TARGETPORT=20 NEWWEBPROPERTY1PORT=20

上一個命令僅適用於一個 Web 資料夾。如果您有一個以上的 Web 資料夾,請依先前指定的方式為每個資料夾加入更多的 PROPERTY=VALUE 組,將每個列出之資料夾的通訊埠重新導向到指定的通訊埠。

您可能會想要移除 [安裝位址] 對話方塊,因為如果有人在安裝時於使用者介面中變更此通訊埠,自訂 Web 資料夾就會使用命令列的值。

如何安裝至網站的根目錄?

若要安裝至網站的根目錄 (例如 c:\inetpub\wwwroot),請在 Web 安裝專案中或在安裝時,將 [VirtualDirectory] 設為空字串。

如何將 ServicedComponent 安裝至 GAC 並在 COM+ 資料庫目錄中加以設定?

如果您嘗試將 ServicedComponent 安裝至全域組件快取 (Global Assembly Cache,GAC),並在 COM+ 目錄中予以設定,您可能會收到下列編譯錯誤:

"Unable to build custom action named 'Primary output from RegServer (Active)' because the file's Folder property is set to Global Assembly Cache."

系統不支援這種安裝,因為當自訂動作在執行時,GAC 中的組件並非隨時可用 (GAC 認可)。

解決方法就是將您的程式碼放入不同的檔案中,然後盡可能將自訂動作程式碼放入不會進入 GAC 的檔案。不過,有時候您會無法用這種方式散發程式碼。

如何在安裝後自動執行程式?

  1. 建立包含下列程式碼的 .vbs 檔:

    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run """" & Property("CustomActionData") & """",7,False
    Set WshShell = Nothing
    
  2. 開啟安裝專案,並移至 [自訂動作編輯器]。

  3. 選取 [認可] 節點,然後按一下滑鼠右鍵,並加入新的 [自訂動作]。

  4. 瀏覽檔案系統,加入您在步驟 1 中所建立的 .vbs 檔。

  5. 加入下列文字來編輯 [CustomActionData] 屬性,其中 YourApp.exe 就是啟動應用程式檔的名稱:

    [TARGETDIR]YourApp.exe

如何在捷徑上建立解除安裝連結?

  1. 在安裝專案的目錄中,建立新的 Uninstall.bat 檔。

  2. 在安裝專案中,複製 [ProductCode] 屬性 (如同 [12345678-1234-1234-1234-123412341234] 的值)。

  3. 編輯 Uninstall.bat,讓它包含下列這一行程式碼,其中 ProductCode 就是您在步驟 2 中複製的值:

    Msiexec /x ProductCode

  4. 將 Uninstall.bat 加入至安裝專案的應用程式資料夾中。

  5. 以滑鼠右鍵按一下 Uninstall.bat,並選取 [建立捷徑] 即可建立捷徑。

  6. 將捷徑放置在安裝專案的適當 [開始] 功能表資料夾中。

  7. 將此捷徑重新命名為類似「解除安裝 <應用程式名稱>」的名稱。

哪裡可以找到如何使用安裝專案的範例?

如需如何使用安裝專案的範例,請參閱 Windows Installer 部署逐步解說

如何規劃 .NET Framework 架構應用程式的部署?

本指南將提供您規劃和實作有效的 .NET Framework 架構應用程式部署時所需的必要資訊:部署 .NET Framework 架構應用程式 (英文)。

哪裡可以下載 Windows Installer SDK?

您可以從 Platform SDK 網站下載 Windows Installer SDK:

https://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

哪裡可以取得 Crystal Reports 的更新和說明?

您可以從 BusinessObjects.com 網站的 "Downloads & Updates" 頁面安裝更新的軟體與合併模組:

http://support.businessobjects.com/fix/downloads_updates.asp

哪裡可以取得啟動載入器,以協助透過應用程式安裝 .NET Framework?

您可以在下列位置找到 Microsoft .NET Framework Setup.exe 啟動載入器 (Bootstrapper) 範例:

https://www.microsoft.com/downloads/details.aspx?FamilyID=bf253cfd-1efc-4fc5-ba7e-6a6f21403495&displaylang=en

您可以在下列位置找到 Visual Studio .NET Framework 啟動載入器外掛程式:

http://workspaces.gotdotnet.com/vsboot

如何解決「無法復原的建置錯誤」錯誤訊息?

如果您在建置安裝和部署專案時收到「無法復原的建置錯誤」錯誤訊息,請閱讀下列文件:

<PRB:當您建置安裝和部署專案時,出現「無法復原的建置錯誤」錯誤訊息>,網址為 https://support.microsoft.com/kb/329214/zh-tw

如何解決驗證錯誤訊息?

如果您收到類似 An error occurred when validating. HRESULT = '80040155' 的錯誤訊息,請參閱<PRB:當您建置安裝和部署專案時,出現「無法復原的建置錯誤」錯誤訊息>文件,網址為 https://support.microsoft.com/kb/329214/zh-tw,並依照「遺失登錄」的步驟執行。

如何在部署期間使用自訂動作修改 IIS

<在部署期間以自訂動作修改 Internet Information Services>(網址為:https://msdn2.microsoft.com/zh-tw/library/aa289522.aspx) (英文) 一文中說明了修正數個問題的方式。包括下列項目:

  • 如何修改無法在 [檔案系統編輯器] 之 Web 資料夾上使用 IIS 資料夾的設定。

  • 如何部署同時使用 Visual Basic 6 和 Visual Basic .NET (含) 以後版本的混合應用程式。

  • 部署 Visual Studio .NET (含) 以後版本的應用程式與 Visual Basic 6 應用程式之間的變更。

哪裡可以找到 "No Touch Deployment" 的相關資訊?

請參閱<No-Touch Deployment in the .NET Framework>,網址為 https://msdn2.microsoft.com/zh-tw/library/aa289511(vs.71).aspx

如何部署 ASP.NET 應用程式?

如需使用 Visual Studio .NET 部署 ASP.NET 應用程式的詳細資訊,請參閱使用 Visual Studio .NET 部署 ASP.NET 應用程式 (英文)。

安裝於 Windows 2000 之後,應用程式失敗並警告需要 MDAC 2.8

任何參考 System.Data 命名空間的應用程式,對於 Microsoft Data Access Components (MDAC) 2.8 (含) 更新版本都具有相依性。在多數情況下,該檔案已安裝成為作業系統的一部分。對於 Windows 2000 Service Pack3 (含) 之前版本,在安裝應用程式時,可能需要一併安裝該元件。您可將該元件加入至啟動載入器 (Bootstrapper) 套件,並在安裝期間從 Microsoft 下載檔案,即可達到此目的。如需詳細資訊,請參閱部署必要條件 (Visual Studio)

相關知識庫文件

下列知識庫文件將會提供有關 Windows Installer 部署問題的資訊:

請參閱

概念

部署和相依性

其他部署

參考

VirtualDirectory 屬性

其他資源

部署應用程式和元件

Windows Installer 部署逐步解說