У меня есть следующий файл Wix, который должен установить содержимое в C:\SampleProgram
, Сгенерированный MSI должен быть установлен как msiexec /i installer.msi IPADDRESS="1.1.1.1"
, Параметр IPADDRESS
выбирается с помощью Custom Action, который создаст файл конфигурации, как показано ниже, в папке, в которую программа сама себя устанавливает.
{
"ip" : "1.1.1.1"}
Проблема в том, что сгенерированный установочный файл отлично работает на одном из моих компьютеров, но он создает только конфигурационный файл на другом компьютере. Папка, в которую успешно установлен MSI, будет иметь все Component
Файлы, определенные в ComponentGroup
моего файла wix. При успешной установке установщик скопирует все эти компоненты в установленную папку. Несмотря на то, что он не установил файлы, но запустил Custom Action.
Подробный журнал дается Вот.
Если кто-то ищет Компонент: BoostThreadLibrary , я получил Установлено: отсутствует, который как дано Вот Говорит, что Компонент или функция в настоящее время не установлены..
Ошибка связана с моей машиной или этим кодом.
Я приложил файл wix ниже:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SampleProgram" Language="1033" Version="3.0.0" Manufacturer="Learning" UpgradeCode="a0265d05-8e65-4af2-98e1-a675b728dd2d">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="ProductFeature" Title="SampleProgram" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WindowsVolume">
<Directory Id="INSTALLFOLDER" Name="SampleProgram" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="ProductComponent">
<File
Id="LPAEXE"Name="lpa.exe"DiskId="1"Source="$(var.lpa.TargetPath)"Vital="yes"KeyPath="yes" />
<?if $(var.Configuration) = "Release"?>
<ServiceInstall Id="ServiceInstaller" Type="ownProcess" Vital="yes"Name="LearningService" DisplayName="LearningService"Description="How to make a Service" Start="auto"Account="LocalSystem" ErrorControl="normal" Interactive="no" />
<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall"Name="LearningService" Wait="yes" />
<?endif?>
</Component>
<Component Id="BoostThreadLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_thread-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_thread-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostSystemLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_system-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_system-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostChronoLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_chrono-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_chrono-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostFileSystemLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_filesystem-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_filesystem-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostDateTimeLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_date_time-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_date_time-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostZlibLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_zlib-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_zlib-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostIOStreamLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_iostreams-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_iostreams-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="BoostRegexLibrary">
<?if $(var.Configuration) = "Debug"?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_regex-vc100-mt-gd-1_55.dll" />
<?else?>
<File Source ="C:\boost_1_55_0_dyn\stage\lib\boost_regex-vc100-mt-1_55.dll" />
<?endif?>
</Component>
<Component Id="libeay32">
<File Source ="C:\OpenSSL-Win32\libeay32.dll" />
</Component>
<Component Id="ssleay32">
<File Source ="C:\OpenSSL-Win32\ssleay32.dll" />
</Component>
<Component Id="czmq">
<?if $(var.Configuration) = "Debug"?>
<File Source ="..\..\ext_library\zmq\czmq\czmq-2.1.0\lib\Win32\DebugDLL\czmq.dll" />
<?else?>
<File Source ="..\..\ext_library\zmq\czmq\czmq-2.1.0\lib\Win32\ReleaseDLL\czmq.dll" />
<?endif?>
</Component>
<Component Id="log4cplus">
<?if $(var.Configuration) = "Debug"?>
<File Source ="..\..\ext_library\log4cplus\bin\Debug\log4cplusD.dll" />
<?else?>
<File Source ="..\..\ext_library\log4cplus\bin\Release\log4cplus.dll" />
<?endif?>
</Component>
<Component Id="libzmq">
<?if $(var.Configuration) = "Debug"?>
<File Source ="..\..\ext_library\zmq\zeromq-4.0.3\lib\Win32\Debug\libzmq.dll" />
<?else?>
<File Source ="..\..\ext_library\zmq\zeromq-4.0.3\lib\Win32\Release\libzmq.dll" />
<?endif?>
</Component>
<Component Id="SSL_Crt_File">
<File Source ="..\..\src\keys\ca.crt" />
</Component>
</ComponentGroup>
<Binary Id="SetupCA" SourceFile="..\..\ext_library\SetupCA\SetupCA\bin\Release\SetupCA.CA.dll"/>
<CustomAction Id="WRITEFILETODISK" Execute="immediate" BinaryKey="SetupCA" DllEntry="WriteFileToDisk" />
<InstallExecuteSequence>
<Custom Action="WRITEFILETODISK" Sequence="2"></Custom>
</InstallExecuteSequence>
</Fragment>
</Wix>
Суть вашей проблемы — планирование ваших пользовательских действий:
<CustomAction Id="WRITEFILETODISK" Execute="immediate" BinaryKey="SetupCA" DllEntry="WriteFileToDisk" />
<InstallExecuteSequence>
<Custom Action="WRITEFILETODISK" Sequence="2"></Custom>
</InstallExecuteSequence>
Как немедленное действие запланировано до InstallFinalize
любые изменения в файлах не произойдут к моменту запуска этого настраиваемого действия. Хотя это может быть важно, скажем, для удаления, это, вероятно, противоположно тому, что вы хотите для установки.
Чтобы прочитать файлы, которые установлены вашей установкой, вы должны запланировать свои действия Execute="deferred"
и когда-нибудь после InstallFiles
, Если вы изменяете элементы в системном расположении, это также должно быть Impersonate="No"
, который работает только в контексте отложенного выполнения.
Обратите внимание, что после того, как ваше действие будет отложено, вам придется обращаться к свойствам через CustomActionData
,
Я не знаю почему, но меняю upgrade code
другим GUID
действительно решил проблему.