В настоящее время у меня есть устаревший проект Visual Studio Install Projects, который создает MSI. При этом я могу указать "TARGETDIR =" somepath "" в командной строке и установить его в "somepath". Теперь в WIX, если я не указываю ProgramFilesFolder в моих wxs, «TARGETDIR» все еще работает, однако в моем пользовательском интерфейсе установщика путь по умолчанию - «C: \ Manufacturer \ Product», тогда как я все еще хочу, чтобы он по умолчанию был ProgramFilesFolder. Наличие поддержки «TARGETDIR» необходимо также для поддержки обновления до устаревшего MSI из самого приложения.
Я нашел несколько способов изменить каталог по умолчанию для пользовательского интерфейса на ProgramFilesFolder, однако TARGETDIR не меняется на этот каталог (или каталог, указанный пользователем), поэтому он все равно устанавливается в C: \ Manufacturer \ Product.
У кого-нибудь есть какие-нибудь идеи здесь? Я предполагаю, что какое-то специальное действие сделает это, но я чувствую, что попробовал большинство предложений, таких как:
- { ссылка }, но это переопределит любой выбранный каталог в или в командной строке
- Я также попытался создать свойство WiX "TARGETDIR", чтобы отобразить его в командной строке, но, поскольку это уже внутренний файл, это не имело значения.
- Как установить значение по умолчанию для пути установки WiX Msi в пользовательском интерфейсе для Program Files? как уже упоминалось, это помешало бы мне использовать "TARGETDIR" в командной строке
- https://wixtoolset.org//documentation/manual/v3/wixui/dialog_reference/wixui_advanced.html, а затем с помощью настраиваемого действия установить «TARGETDIR» в «APPLICATIONFOLDER». При этом я могу установить местоположение по умолчанию в ProgramFilesFolder, но тогда я не нашел способа установить «TARGETDIR» в нужное время, чтобы использовать значение командной строки или выбранное пользователем. Мне почти нужен способ сделать «если« APPLICATIONFOLDER »не является значением по умолчанию; использовать его значение ИЛИ, если« TARGETDIR »не является значением по умолчанию; использовать его значение ИЛИ использовать значение по умолчанию». Кажется, что это также не позволяет расширять переменные, поэтому я не могу использовать «[ProgramFilesFolder]», я должен явно выписать «C: \ Program Files ...», что не идеально.
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="blah">
Как уже упоминалось, я должен иметь возможность использовать "TARGETDIR", а не "INSTALLDIR" (хотя это работает).
Если у меня действительно есть для использования "INSTALLDIR" затем я могу заставить его работать, но это усложняет поддержку устаревших MSI и WiX из-за характера их использования.
Edit
Решение: <Custom Action="SetINSTALLDIR" Before="AppSearch">Not Installed</Custom>
в InstallExecuteSequence
и InstallUISequence
.
Это указывает на: <CustomAction Id="SetINSTALLDIR" BinaryKey="CustomActionsBinary" DllEntry="SetInstallDir" />
SetInstallDir
:
[CustomAction]
public static ActionResult SetInstallDir(Session session)
{
TraceLogger.yRTraceInfo(nameof(SetInstallDir));
string installDir = session["APPLICATIONFOLDER"];
string targetDir = string.Empty;
try
{
targetDir = session["TARGETDIR"];
}
catch (Exception e)
{
Console.log(e.Message);
}
if (string.IsNullOrEmpty(installDir) && !string.IsNullOrEmpty(targetDir))
{
session["APPLICATIONFOLDER"] = targetDir;
console.log($"Setting APPLICATIONFOLDER to {targetDir}");
}
return ActionResult.Success;
}