2014-12-04 3 views
0

У меня есть следующий код Wix, который должен отправить значение свойства в Custom Action, написанное на C#. В основном, что я хочу, когда MSI установлен, я хочу написать путь к папке, где Wix установил программу в текстовый файл. Я ссылался на сайт this и создал соответствующий код, но мое пользовательское действие не работает.Wix Custom Action Реализация для написания Installfolder в тексте

Ниже мой Wix Файл:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="SetupInstallFolder" Language="1033" Version="1.0.0.0" Manufacturer="LP" UpgradeCode="9e10a7d8-4ffb-493c-8318-c44ba4bc0c4c"> 
     <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" /> 

     <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
     <MediaTemplate /> 

     <Feature Id="ProductFeature" Title="SetupInstallFolder" Level="1"> 
      <ComponentGroupRef Id="ProductComponents" /> 
     </Feature> 
    </Product> 

    <Fragment> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder"> 
       <Directory Id="INSTALLFOLDER" Name="SetupInstallFolder" /> 
      </Directory> 
     </Directory> 
    </Fragment> 

    <Fragment> 
     <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
     <Component Id="SomeRandomEXE"> 
     <File Source ="G:\SarVaGYa\myworkspace\LatestLpa\lpa\lpa_c\here\src\lpa\Release\lpa.exe" /> 
     </Component>  
     </ComponentGroup> 
    <Binary Id="SetupCA2" src="G:\visual studio stuffs\SetupCAInstallFolder\SetupCAInstallFolder\bin\Release\SetupCAInstallFolder.CA.dll"/> 
    <CustomAction Id="INSTALLFOLDERFINDER" Execute="immediate" Property="INSTALLEDPATH" Value="[INSTALLFOLDER]" /> 
    <InstallExecuteSequence> 
     <Custom Action="INSTALLFOLDERFINDER" Sequence="2"></Custom> 

    </InstallExecuteSequence> 
    </Fragment> 
</Wix> 

Я также дал мой C# код, который должен получить значение и записать его в файл:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Deployment.WindowsInstaller; 

namespace SetupCAInstallFolder 
{ 
    public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult InstallFolderFinder(Session session) 
     { 
      session.Log("Here is the SetupCAInstallFolder"); 
      string path = session["INSTALLEDPATH"]; 
      session.Log("Installed Path is " + path); 
      System.IO.File.WriteAllText("F:\\pathgenerated.txt", path); 
      //System.IO.File.WriteAllText(path + "installed.txt", "sdkasdkasdlkasdk"); 

      return ActionResult.Success; 
     } 
    } 
} 

Файл Wix компилирует и дает MSI, который не получает значение INSTALLEDPATH. Если я добавлю DllEntry = "InstallFolderFinder" в тег CustomAction, он не с ошибкой Атрибут CustomAction/@ DllEntry не может сосуществовать с ранее указанным атрибутом этого элемента. Элемент CustomAction может иметь только один из следующих целевых атрибутов, указанных в то время: DllEntry, Error, ExeCommand, JScriptCall, Script, значение или VBScriptCall

Как передать значение INSTALLEDPATH на C# пользовательских действий?

ответ

3

Я исправил проблему после спотыкания вокруг еще одного сайта. Я добавил код в gist. Wix код Файл here и C# код пользовательского действия here. В основном я добавил два пользовательских тега в InstallExexuteSequeunce, которые сначала загружают dllentry, а второй передает параметр Custom Custom, написанному на C#.

+0

Интересно - мне нравится это решение, и я не думал использовать другое настраиваемое действие для установки значения на основе значения пользовательского интерфейса. Ницца. – Joe

+0

Смотрите мой комментарий для моего ответа.Это хороший рабочий пример для отложенных пользовательских действий (если кому-то нужны отложенные ЦС). – Philm

1

MSI определяет пути между действиями CostInitialize и CostFinalize. Использование жестко кодированных последовательностей очень редко рекомендуется, и, возможно, вы выбрали неверный порядковый номер для этого.

Try:

<InstallExecuteSequence> 
    <Custom Action='INSTALLFOLDERFINDER' After='CostFinalize'></Custom> 
</InstallExecuteSequence> 

Я надеюсь, что вы уверены, INSTALLDEDPATH ваши правильные собственности. Базовое свойство MSI для путей - `TARGETDIR.

Если он по-прежнему не работает, попробуйте выполнить собственное действие 51 с настройкой свойства MYDUMMY на значение [INSTALLEDPATH]. Теперь вы можете видеть, если хотя бы значение правильно написано в стандартном пользовательском действии, не запрограммированном.

+0

Philm благодарит вас за понимание. После некоторого поиска я нашел решение. – Pant

+0

Жалость, что она работает сейчас. FYI: Решение, которое вы нашли, является решением для отложенных пользовательских действий (поскольку вы параметризировали в своем WiX-коде: Execute = «отложен»). Для простого чтения свойств отложенные пользовательские действия не очень удобны (как вы видите, сначала вам нужно другое настраиваемое действие, нажимая нужные свойства). Это то, о чем я упомянул вскоре в последнем вопросе. Для простого считывания свойств достаточно иметь немедленные пользовательские действия, но тогда вам нужно правильное положение в последовательности, как описано в моем ответе. – Philm

Смежные вопросы