2014-10-25 2 views
0

У меня есть несколько связанных записей реестра 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(); 
    } 
} 

}

ответ

0

Вы можете добиться того, что вы хотите, добавив <RemoveFolder> тег в компоненте в каталоге вы не хотите сохранить. См. reference.

В результате MSI будет создан light с предупреждением LGHT1079, что у вас нет файлов, но его можно игнорировать, если это намерение.

Простой пример XML, показывающий каталог с компонентом, который удаляет папку при установке/удалении и создает разделы реестра, заставляя удалять при удалении.

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Component Id="ApplicationRegistry" Guid="YOUR-GUID-HERE"> 
     <RemoveFolder Id="RemoveTarget" Directory="TARGETDIR" On="both"/> 
     <RegistryKey Root="HKCU" 
       Key="Software\Microsoft\[ProductName]" 
       ForceDeleteOnUninstall="yes"> 
       <RegistryValue Type="integer" Name="SomeIntegerValue" Value="1" KeyPath="yes"/> 
       <RegistryValue Type="string" Value="Default Value"/> 
     </RegistryKey> 
    </Component> 
</Directory> 

Вы бы просто либо использовать это имя для каталога, или замените Directory="TARGETDIR" с именем каталога.

Результат после установки - это раздел реестра без папки на целевой машине. registry key path

Вы должны были бы выяснить, как получить этот тег в генерируемом XML, но это эффект, который вы должны были бы.

+0

Это выглядит очень многообещающим. Существует как минимум два потенциальных подхода с Wix # для получения этого тега в результирующем файле .wxs - 1) Синтаксис Wix # (я должен исследовать/найти примеры) и 2) XML-пост-обработку текстовой подстановки, например, подключение метод делегата для события Wix #, который запускается, когда он завершил создание файла .wxs, но до компиляции/ссылки на MSI. Я попробую и отчитаю! – Developer63

+0

Когда у меня возникает эта проблема, я просто добавляю в дерево каталогов стандартную папку, например CommonFilesFolder, и это каталог. Нет нужды, чтобы создать нежелательную папку и удалить ее, просто используйте тот, который уже находится в системе. – PhilDW

+0

Возможно, это тоже сработает. Я действительно хотел его решить, используя подход ввода XML в сгенерированный файл .wxs, потому что этот подход может применяться к различным ситуациям, где Wix # не генерирует точно такой XML-код .wxs, который я хочу. – Developer63

0

Использование XML-кода Wix Ryan J, а также пример «InjectXML» из кода образцов Wix #, мне удалось создать файл wxs и получить рабочую MSI, все еще находясь в среде кодирования Wix # в Visual Studio.

Вот соответствующий .wxs XML, который генерируется до того, под элементом:

<Directory Id="TARGETDIR" Name="SourceDir" > 
    <Directory Id="INSTALLDIR" Name="%Temp%"> 
    <Component Id="INSTALLDIR.EmptyDirectory" Guid="037c625a-609c-4c2c-9689-62a075b88ae9"> 
     <CreateFolder /> 
    </Component> 

Так что должно произойти это: 1) Удалить элемент «», который находится под Product/Каталог/Каталог/Component. Пример Ryan J ясно показал, что он идет под «Компонента», который связан с созданным первым «Каталогом», который, в свою очередь, под «TARGETDIR», в XML, который генерирует Wix #.

2) Вставьте синтаксис элемента, "", под элементом Product/Directory/Directory/Component. Хотя я считаю, что он также может работать для ссылки на Id «INSTALLDIR.EmptyDirectory» в этом элементе, я использовал идентификатор «TARGETDIR», и он работал так, как я хотел.

Вот результирующий Wix # код, который впрыскивает XML, поставляемый Ryan J.

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(@"TempDeleteMe"), 
 
... 
 
      // Hook up a delegate to the "WixSourceGenerated" event, fires when .wxs file is fully created 
 
      Compiler.WixSourceGenerated += InjectXMLElement; 
 
      // Trigger the MSI file build 
 
      Compiler.BuildMsi(project); 
 
... 
 

 
     /// Insert XML elements and attributes into the generated .wxs file 
 
     static void InjectXMLElement(System.Xml.Linq.XDocument document) 
 
     { 
 
      // Remove the <CreateFolder /> tag from Directory element -- we don't want to create it 
 
      var createFolderElement = document.Root.Select("Product/Directory/Directory/Component/CreateFolder"); 
 
      createFolderElement.Remove(); 
 
      // To cause the folder to not be created on the target system, add this element: 
 
      // <RemoveFolder Id="RemoveTarget" Directory="TARGETDIR" On="both"/> 
 
      var componentElement = document.Root.Select("Product/Directory/Directory/Component"); 
 
      
 
      componentElement.Add(new XElement("RemoveFolder", 
 
         new XAttribute("Id", "RemoveTarget"), 
 
         new XAttribute("Directory", "TARGETDIR"), 
 
         new XAttribute("On","both"))); 
 
     }

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