У меня есть несколько связанных записей реестра Windows, которые я хочу упаковать внутри MSI, так что 1) есть процесс удаления и 2) Тот факт, что эти записи реестра были применены к данному компьютеру, документируется с помощью Add/Remove Ввод программ.В Wix #, как избежать создания физической папки в целевой системе при развертывании только записей реестра?
Проблема в том, что я могу заставить Wix # сделать это просто отлично, но я могу получить только MSI, если все записи реестра находятся внутри блока «Dir», и это завершает фактически создание физической папки , чего я не хочу, в целевой системе.
Как временное обходное решение, я завершил работу с использованием блока Dir, указав папку «Temp». Установщик действительно создает папку, которую я не хочу; все, что я хочу, это использовать записи реестра.
Документация WiX описывает его базовую конструкцию TargetDir, по существу говоря инсталлятора для выполнения своих действий в целевой системе. См. http://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/write_a_registry_entry.html
В этом родном примере WiX XML кажется, что в целевой системе не будет посторонней папки; будут применены только нужные записи в реестре. Какую конструкцию синтаксиса Wix # я могу использовать для применения записей в реестре, но не нужно создавать фактическую папку в целевой системе?
Все образцы Wix #, которые я видел до сих пор, похоже, имеют этот побочный эффект создания фактической папки в целевой системе, независимо от того, хотите вы этого или нет.
Я знаю, что, возможно, я мог бы сделать это, взяв REG-файлы из записей реестра, собрав их в .wxs-файлы с высокой температурой, а затем построил их для msi со свечой и светом. Я действительно пытаюсь сохранить это в мире C#/Wix #. C# - хорошо понятый набор навыков в моей организации; WiX меньше. (Признание того, что Wix # построен поверх функций WiX, и очень важно понимание WiX и установщика Windows, это вещь зоны комфорта, возможность использовать C# вместо XML, а не полностью логичную вещь). В настоящее время, мы выполняем многие из этих заданий параметров реестра вручную, без следа и простой и надежной деинсталляции.
/// <summary>
/// Configure the Event Log on a Windows (server) to have MyApplication Log settings and record an entry for it in Programs and Features.
/// Note that this program creates the Windows Installer MSI that accomplishes this.
/// This program creates a WiX XML file that is then compiled by the WiX Toolkit (Candle and Light) into the MSI file.
/// </summary>
internal class Script
{
public static void Main()
{
// Define a new Installer Project object
var project = new Project("SetupMyApplicationEventLog" ,
// Provide dummy "Temp" install directory to satisfy WiX# Syntactical requirement. There are no actual files being installed.
new Dir(@"Temp"),
/*
* Event Log Registration Entries, translated from .reg file
*/
// First, add the root level key of the tree of keys
//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log]
//"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll"
new RegValue(
RegistryHive.LocalMachine,
@"SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log",
"",
"") { AttributesDefinition = "Component:Win64=yes" },
//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\STV.DSD.HQSYS.SERVICE2]
//"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll"
new RegValue(
RegistryHive.LocalMachine,
@"SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\" + "STV.DSD.HQSYS.SERVICE2",
"EventMessageFile",
"C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll") { AttributesDefinition = "Component:Win64=yes" },
//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\STV.VFS.ONLINE]
//"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll"
new RegValue(
RegistryHive.LocalMachine,
@"SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\" + "STV.VFS.ONLINE",
"EventMessageFile",
"C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll") { AttributesDefinition = "Component:Win64=yes" });
// Set the properties of the setup project
// Set UI to minimal; there are no choices to be made here.
project.UI = WUI.WixUI_ProgressOnly;
project.Manufacturer = "STV";
project.OutFileName = "SetupMyApplicationEventLog";
project.GUID = new Guid("037C625A-609C-4C2C-9689-62A075B88AD7");
// Assign version # to setup MSI property of type System.Version
project.Version = new Version(4, 0, 0, 0);
// Add the Win64 attribute to the package, to force a 64-bit MSI to be created
project.Package.AttributesDefinition = "Platform=x64";
// Trigger the MSI file build
Compiler.BuildMsi(project);
//// Also create the .wxs file so we can see what was sent to WiX to build the MSI
Compiler.BuildWxs(project);
Console.WriteLine("productVersion=" + project.Version);
Console.ReadLine();
}
}
}
Это выглядит очень многообещающим. Существует как минимум два потенциальных подхода с Wix # для получения этого тега в результирующем файле .wxs - 1) Синтаксис Wix # (я должен исследовать/найти примеры) и 2) XML-пост-обработку текстовой подстановки, например, подключение метод делегата для события Wix #, который запускается, когда он завершил создание файла .wxs, но до компиляции/ссылки на MSI. Я попробую и отчитаю! – Developer63
Когда у меня возникает эта проблема, я просто добавляю в дерево каталогов стандартную папку, например CommonFilesFolder, и это каталог. Нет нужды, чтобы создать нежелательную папку и удалить ее, просто используйте тот, который уже находится в системе. – PhilDW
Возможно, это тоже сработает. Я действительно хотел его решить, используя подход ввода XML в сгенерированный файл .wxs, потому что этот подход может применяться к различным ситуациям, где Wix # не генерирует точно такой XML-код .wxs, который я хочу. – Developer63