2012-10-12 17 views
6

Tôi đang cố viết kịch bản Trình cài đặt Windows trong WiX 3.6 với cài đặt chỉ cho mỗi máy và kiến ​​trúc x64. Tôi có cấu trúc dự án sau (được rút ngắn):Lỗi "ICE38: Thành phần cài đặt vào hồ sơ người dùng" cho một thành phần cụ thể

<Directory Id="ProgramFiles64Folder" Name="PFiles"> 
    <Directory Id="APPLICATIONFOLDER" Name="My Company"> 
     <Directory Id="ProductFolder" Name="My Product"> 
     <Component Id="MainComponent" Guid="" Win64="yes" KeyPath="yes"> 
      ... 
     </Component> 
     <Directory Id="DataFolder" Name="Data"> 
      <Directory Id="Machine" Name="Machine" > 
      <Directory Id="MachinesFolder" Name="Machines"> 
       <Component Id="Machine1" Guid="{74341536-72DF-48C3-95E8-2851D9FA8318}" Win64="yes" KeyPath="yes"> 
         ... 
       </Component> 
      </Directory> 
      <Directory Id="TemplateFolder" Name="Template"> 
       <Component Id="TemplateFiles" Guid="{A0D0C225-D604-4B84-971D-41687A30EC36}" Win64="yes" KeyPath="yes"> 
       <File Id="Template1.rsbak" Source="$(var.SolutionDir)bin\Release\File1.rsbak" /> 
          ... 
       </Component> 
      </Directory> 
      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 
</Directory> 

Vấn đề là tôi nhận được lỗi ICE38: Component TemplateFiles installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file cho thành phần TemplateFiles khi tôi biên dịch. Điều làm tôi bối rối là tôi sử dụng một cấu trúc tương tự trong một dự án khác (làm việc), và có một số thành phần với cùng một thiết lập tương tự trong dự án của tôi (không được hiển thị ở trên). Tại sao điều này - và thành phần duy nhất này nhấn mạnh vào việc cài đặt vào hồ sơ người dùng khi tất cả những người khác được cài đặt đúng, vào Program Files?

Trả lời

5

Có vẻ như có sự khác biệt đáng kể đối với msi giữa các thư mục Program FilesUsers\UserName\Documents. Cuối cùng được tham chiếu trong ví dụ của bạn:

<Directory Id="DataFolder" Name="Data"> 

tôi đến các vấn đề tương tự và tìm thấy một câu trả lời trong bài viết trên blog - http://robmensching.com/blog/posts/2007/4/27/How-to-create-an-uninstall-shortcut-and-pass-all-the

Nói tóm lại bạn cần xác định RegistryKey trên HKCU gốc như subelement để Component và thêm phần tử RemoveFolder làm phần phụ để Directory. Xem liên kết ở trên để biết ví dụ đầy đủ. Ngoài ra:

  • Remove KeyPath thuộc tính từ Component yếu tố
  • RemoveFolder có thể phải được xác định cho tất cả các thư mục. Tôi đã sử dụng thành phần giả không có tệp bên trong cho rằng
+0

Cảm ơn bạn. Mặc dù vấn đề của tôi đã được giải quyết (!?) khi chúng tôi buộc phải cấu trúc lại các thư mục của chúng tôi, tôi tin rằng câu trả lời của bạn là đúng cách để làm điều đó. –

+0

Niềm vui. Tôi đã có cùng một vấn đề này bản thân mình. Vì vậy, thêm một giải pháp cho những kẻ tiếp theo sẽ có nó. –