2014-01-17 10 views
4

Итак, я создаю свой первый проект Wix, и у меня, похоже, проблема с выполнением пользовательского действия. Я не уверен, что он включен в msi, и я не совсем уверен, что я делаю неправильно. Ниже мой Wix файл:CustomAction in Wix не выполняет

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="ExactaDynamicManifest" Language="1033" Version="1.0.0.0" Manufacturer="Bastian Software Solutions" UpgradeCode="274ff2d9-e291-4706-a8db-ce80ccd91538"> 
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/> 

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

     <Feature Id="ProductFeature" Title="ExactaDynamicManifest" Level="1"> 
     <ComponentGroupRef Id="ExactaDynamicManifest"/> 
     </Feature> 

     <Icon Id="exacta.ico" SourceFile="icons\exacta.ico"/> 
     <Property Id="ARPPRODUCTICON" Value="exacta.ico" /> 

    </Product> 

    <Fragment> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder"> 
     <Directory Id="ExactaFolder" Name ="Exacta"> 
        <Directory Id="INSTALLFOLDER" Name="ExactaExactaDynamicManifest" /> 
     </Directory> 
      </Directory> 
     </Directory> 
    </Fragment> 

    <Fragment> 
     <CustomAction Id="InstallService" FileKey="ExactaDynamicManifest.exe" ExeCommand="install"/> 
     <InstallExecuteSequence> 
     <Custom Action="InstallService" After="InstallFinalize"/> 
     </InstallExecuteSequence> 
    </Fragment> 
</Wix> 

последний фрагмент содержит мое пользовательское действие, которое я надеялся сделать это в командной строке после того, как все файлы были размещены в каталоге:

ExactaDynamicManifest.exe install 

Следует отметить, что exe на самом деле происходит от ComponentGroupRef, определенного выше. Не уверен, что это проблема или нет, но я думал об этом. Любая помощь будет оценена по достоинству.

+0

Проверьте мой ответ здесь, это должно помочь вам: http://stackoverflow.com/a/19274431/1766402 – Isaiah4110

ответ

5

У меня наконец-то есть что-то работающее. Моя первоначальная проблема CustomAction не загружалась из-за того, что она находилась в другом <fragment>. Я объединил весь код в один фрагмент и, казалось, работал.

После борьбы с правами пользователя и т.д. Я, наконец, в конечном итоге с этим решением:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="ExactaDynamicManifest" Language="1033" Version="1.0.0.0" Manufacturer="Bastian Software Solutions" UpgradeCode="274ff2d9-e291-4706-a8db-ce80ccd91538"> 
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/> 

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

     <Feature Id="ProductFeature" Title="ExactaDynamicManifest" Level="1"> 
     <ComponentGroupRef Id="ExactaDynamicManifest"/> 
     </Feature> 

     <Icon Id="exacta.ico" SourceFile="icons\exacta.ico"/> 
     <Property Id="ARPPRODUCTICON" Value="exacta.ico" /> 

    </Product> 

    <Fragment> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
      <Directory Id="ExactaFolder" Name ="Exacta"> 
      <Directory Id="INSTALLFOLDER" Name="ExactaExactaDynamicManifest" /> 
      </Directory> 
     </Directory> 
     </Directory> 

     <CustomAction Id="RunTopShelfServiceInstall" Directory="INSTALLFOLDER" Execute="deferred" Return="ignore" Impersonate="no" ExeCommand="[INSTALLFOLDER]ExactaDynamicManifest.exe install"/> 
     <CustomAction Id="RunTopShelfServiceUninstall" Directory="INSTALLFOLDER" Execute="deferred" Return="ignore" Impersonate="no" ExeCommand="[INSTALLFOLDER]ExactaDynamicManifest.exe uninstall"/> 

     <InstallExecuteSequence> 
     <Custom Action="RunTopShelfServiceInstall" After="InstallFiles"> 
      NOT Installed 
     </Custom> 
     <Custom Action="RunTopShelfServiceUninstall" After='InstallInitialize'> 
      (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") 
     </Custom> 
     </InstallExecuteSequence> 

    </Fragment> 
</Wix> 
+0

Вы также можете отделить свое имя service.exe от своего кода wix через: ExeCommand = "[INSTALLFOLDER] $ (var.YourServiceProjectName.TargetName) установить", предположив, что вы добавили проект в качестве ссылки на ваш проект wix. –

0
  1. Вы собираетесь зарегистрировать услугу, используя специальное действие? Вам также придется обрабатывать операции удаления, восстановления. Это гораздо проще использовать стандартные функции MSI для установки услуги: http://wixtoolset.org/documentation/manual/v3/xsd/wix/serviceinstall.html

  2. Если вы хотите использовать пользовательские действия для этой цели и UAC включен не будет установлена ​​ваша служба в связи с разрешениями. Вы должны использовать отложенные и не выданные персонализированные действия, запланированные до InstallFinalize (после того, как пользовательские действия InstallFinalize не могут быть запланированы).

+0

Да, я устанавливаю службу через CustomAction. Я не использую стандартную установку сервиса в Wix, потому что это НЕ стандартная услуга. Я использую фреймворк под названием Topshelf (http://topshelf-project.com/). Также я планирую обрабатывать удаление и ремонт, но сначала сначала ... Мне нужно установить сервис. –

+0

Мы также используем Topshelf для наших услуг, это не противоречит стандартным функциям MSI. Если ваша служба делает что-то определенное во время установки, вы можете сделать это во время первого запуска. – leshy84

+0

Это интересно, потому что большинство статей, которые я читал в Интернете, которые ссылаются на установку сервисов Topshelf, рекомендуют использовать CustomActions для этого. Я видел статью, в которой говорится о создании класса Installer, как обычной службы Windows, но в этот момент я задаю вопрос, почему я даже использую Topshelf. Итак, вы создаете этот класс установщика, чтобы иметь возможность использовать стандартную функциональность в Wix? –

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