2012-08-24 128 views
12

以下目錄設置完美適合我。如何安裝到LocalAppData文件夾?

<Directory Id='TARGETDIR' Name='SourceDir'> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id='INSTALLDIR' Name='MyApp'/> 
    </Directory> 
</Directory> 

然而,當我試圖改變 「ProgramFilesFolder」 到 「LocalAppDataFolder」,我得到了很多錯誤的使用light時,鏈接和生成我的MSI:

D:\runGroup.wxs(53) : error LGHT0204: ICE38: Component cmpA5561BE36D80EB58252E69DDA0C2FF8C installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file. D:\main.wxs(38) : error LGHT0204 : ICE64: The directory INSTALLDIR is in the user profile but is not listed in the Remove File table.

貌似「 LocalAppDataFolder「不適用於WiX,但我相信它是here中定義的系統文件夾屬性之一。

我應該爲LocalAppData文件夾使用什麼?

+0

我的建議:根本不要安裝到任何userprofile文件夾。安裝到[ProgramFilesFolder]並允許操作系統執行任何重定向。每個操作系統都可以以不同的方式做到這一點,而你的「引擎蓋修補程序」無疑會適得其反。如果該文件夾沒有被操作系統重定向,MSI引用計數應該能夠針對不同用戶對同一個文件夾進行多次安裝。只要確保您沒有任何在文件夾中修改的讀/寫文件即可。您的安裝文件夾應該是隻讀的。不要反抗Windows的特質 - 它會以復仇的方式回擊。 –

+0

這裏的問題是,我不知道如何讓[ProgramFilesFolder]重定向到它應該用於每個用戶安裝的位置。這就是爲什麼我必須找出解決方法。 – Deqing

+0

是的,你不應該重定向它:-)。 Windows可能會再次將您重定向到您,並且在Vista,Windows 7,Windows 8等上以不同的方式進行重新定向...... Windows安裝程序可能會與之抗爭 - 它會反擊。即使對於每個用戶的安裝,您仍然可以安裝到[ProgramFilesFolder],並且一些Windows版本可能會自動重定向它,其他人可能會安裝到ProgramFilesFolder。不要混淆這一點,只要讓它按照Windows的規定工作即可。 –

回答

1

好了,才發現,我們可以通過改寫「ProgramFilesFolder」做到這一點:

<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty> 

另一件事要做的就是,在<Package>我們需要設置InstallPrivilegeslimited

那麼,我可以看到沒有理由爲什麼「ProgramFilesFolder」可以直接使用,而「LocalAppDataFolder」不能。

+0

因爲你不需要這樣做。它會在Win7上自動重定向。 –

+0

ProgramFilesFolder不在我的Win7中重定向。我嘗試使用「受限制」和默認值的InstallPrivileges,都將%ProgramFilesFolder%設置爲「C:\ Program Files(x86)」。我如何觸發此重定向?還有一個問題,請注意,在WixUI_Advanced中,它明確設置每個用戶的安裝路徑爲%LocalAppData%\ Apps \ ProgramName。那麼應該爲每個用戶安裝哪個版本的程序? '%LocalAppData%\ Apps'或'%LocalAppData%\ Programs'? – Deqing

+1

德清,這個解決方案看起來很危險 - 我很驚訝Windows Installer實際上會讓你這樣做。 –

2

您是按用戶還是按機器安裝?另外,你的目標是什麼操作系統版本?您可能需要閱讀:

Authoring a single package for Per-User or Per-Machine Installation context in Windows 7

+0

我正在安裝每個用戶,這就是爲什麼我需要在目錄結構中使用LocalAppData。它將安裝在Win7上。對我來說,唯一的方法就是像我之前描述的那樣使用'SetProperty'。 – Deqing

+0

根據該條規定,每用戶使用ProgramFilesFolder將自動重定向到LOCALAPPDATA \程序安裝Win7上。這不適合你嗎? –

+0

我剛剛創建每個用戶的測試安裝使用InstallShield,並使用[ProgramFilesFolder]我的公司名稱\我的產品名稱設置它,並確保它足夠其安裝到C:\用戶\ chrpai \應用程序數據\本地\程序\我的公司名稱\我的產品名稱我不使用InstallShield建立我的項目 –

7

我從一個perMachine安裝爲每用戶安裝轉換的應用程序。爲了正確轉換安裝,我必須爲每個組件添加一個註冊表項。

本來我有以下幾點:

<Component Id="C.MyExe"> 
    <File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)" Source="$(var.MyExe.TargetPath)" DiskId="1"> 
    <Shortcut Id="SC.StartMenu" 
       Directory="D.ApplicationMenuDir" 
       Name="$(var.AppName)" 
       WorkingDirectory="INSTALLDIR" 
       Icon="MY_ICON.ico" 
       IconIndex="0" 
       Advertise="yes" 
     /> 
     ... 

當我移動的EXE組件給用戶安裝,我不得不做這樣的事情:

<Directory Id="LocalAppDataFolder" Name="AppData"> 
    <Directory Id="MyAppDirectory" Name="$(var.AppName)"> 
    <Component Id="C.MyExe" Guid="{MY_GUID}"> 
     <CreateFolder /> 
     <RemoveFolder Id="RemoveMyAppDirectory" On="uninstall" /> 
     <RegistryKey Root="HKCU" Key="Software\MyCompany\MyApp"> 
     <RegistryValue Name="MainExe" Value="1" KeyPath="yes" Type="integer" /> 
     </RegistryKey> 
     <File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)" 
      Source="$(var.MyExe.TargetPath)" DiskId="1" Checksum="yes"> 
     </File> 
    </Component> 
    ... 

最重要的部分是,你會必須添加一個指向HKEY_CURRENT_USER的註冊表項。我爲每個組件添加了一個註冊表值,表明該組件已安裝。

我還必須刪除以下內容:Advertise="yes"

+0

有人告訴我,你可以忽略ICE38因爲這是僅適用於混合每個用戶/每臺機器的位置和不適用於純每個用戶安裝。參見[這裏](http://stackoverflow.com/a/21715783/623561)。 – Wes

1

我最近有這個問題。我想將我的安裝程序從每臺機器轉換爲每個用戶,但獲得ICE38。我詢問了wix用戶,一個意見是你可以忽略ICE38,因爲這意味着檢查每臺機器的安裝。

the discussion at wix-users

既然如此,ICE38(在我看來)是不正確的,你會想忽略它。 ICE38意味着您在每臺計算機安裝的上下文中安裝每用戶資源,但從不驗證這是如此。

其實創作每一個用戶安裝要求您忽略ICE38 ,因爲它不會永遠是準確的那個世界。

[編輯] 看起來你有幫助here

從彼得·希爾特克利夫:

這是我自己的,每個用戶安裝的公認不熟練,理解:

安裝到LocalAppDataFolder的子目錄是在 每用戶MSI完全確定。由於與漫遊用戶有關的某些情況,您需要爲您在LocalAppDataFolder下創建的任何 目錄添加包含元素的組件。這就是出現ICE64的原因是 。

的ICE38錯誤是有些誤導:既然你有每個用戶的 安裝,它是安全的,只要用戶不能選擇一個 其他安裝的位置,是通用於所有用戶忽略。 ICE38是 檢查多個用戶都將相同的 組件安裝到同一路徑的情況。

只需發佈以幫助其他人(如我)。

相關問題