Wix Toolset - Лучшая практика для файла конфигурации?

У меня есть проект, который перед запуском должен быть правильно настроен.

До сих пор я некоторое время гуглил и не смог найти решения. Я использовал heat для переноса необходимых dll в каталог установки. Чтобы отредактировать этот файл json, я изначально:

  1. Создал настраиваемое действие для сериализации моделей в файл appsettings.json, но по какой-то причине это настраиваемое действие вызывало ошибку, которую я не мог отладить (погуглил и нашел 3 разных решения, но, к сожалению, ни одно из них не смогло мне помочь)

  2. Я решил открыть файл json после установки, который работает, но я не могу найти способ открыть блокнот от имени администратора для редактирования файла json (я уже пробовал кучу решений для этого тоже)

Какое решение следует искать? Возможно, я просто плохо разбираюсь в поиске решений в Google, но, возможно, мне поможет некоторое представление о том, какое решение было бы наилучшей практикой.

Product.wxs

<?xml version="1.0" encoding="UTF-8"?>
<!-- The name of the product -->
<?define Name = "xxx" ?>
<!-- The manufacturer, for setup package publisher and folder info -->
<?define Manufacturer = "xxx" ?>
<!-- The version number of this setup package-->
<?define Version = "1.0.0" ?>
<!-- UpgradeCode must be unique and not changed once the first version of the program is installed. -->
<?define UpgradeCode = "{145ED92C-BA1B-4257-8791-2337A012EEE7}" ?>
<?if $(var.Platform) = x64?>
<?define bitness = "(64 bit)"?>
<?define Win64 = "yes"?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?> 
<?else ?>
<?define bitness = "(32 bit)"?>
<?define Win64 = "no"?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="$(var.Name) $(var.bitness)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)" Version="$(var.Version)" Language="1033">
        <Package InstallerVersion="200" Compressed="yes" InstallPrivileges="elevated"/>

        <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />
        <Media Id="1" Cabinet="xxx.xxx.xxx.WindowsService.cab" EmbedCab="yes" />

        <Feature Id="MainApplication" Title="Main Application" Level="1">
            <ComponentRef Id="$(var.xxx.xxx.xxx.WindowsService.TargetFileName)" />
            <ComponentGroupRef Id="HeatGenerated"/>
        </Feature>

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="$(var.PlatformProgramFilesFolder)">
                <Directory Id="ROOTDIRECTORY" Name="$(var.Manufacturer)">
                    <Directory Id="INSTALLFOLDER" Name="$(var.Name)" />
                </Directory>
            </Directory>
        </Directory>

        <DirectoryRef Id="INSTALLFOLDER">
            <Component Id="$(var.xxx.xxx.xxx.WindowsService.TargetFileName)" Win64="$(var.Win64)" Guid="FD94EF3C-4A0B-4102-AF1E-2A489B4DB7DF">
                <RemoveFile Id="ALLFILES" Name="*.*" On="both" />
                <ServiceInstall Id="ServiceInstaller"
                                Type="ownProcess"
                                Name="xxx.xxx.xxx.WindowsService"
                                Account="LocalSystem"
                                DisplayName="$(var.Name)"
                                Description="Deployment agent for xxx"
                                Start="auto"
                                Interactive="yes"
                                Vital="yes"
                                ErrorControl="critical"
                                Arguments="/start xxx.xxx.xxx.WindowsService"/>
            </Component>
        </DirectoryRef>
        <UIRef Id="SetupDialogUI" />

        <Binary Id="bgPic" SourceFile="images/bg.bmp"/>
        <Binary Id="cancelbtn" SourceFile="images/cancelbtn.bmp"/>
        <Property Id="Cancel">cancelbtn</Property>

        <InstallExecuteSequence>
            <Custom Action='xxx.xxx.xxx.WindowsService.CustomAction' After='InstallFinalize'>NOT Installed</Custom>
        </InstallExecuteSequence>
    </Product>
</Wix>

Журнал ошибок от MSI

MSI (c) (10:64) [15:11:16:149]: Note: 1: 1723 2: xxx.xxx.xxx.WindowsService.CustomAction 3: SaveAppsettings 4: C:\Users\vsun\AppData\Local\Temp\MSIFC10.tmp 
MSI (c) (10:64) [15:11:16:149]: Note: 1: 2205 2:  3: Error 
MSI (c) (10:64) [15:11:16:149]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1723 
MSI (c) (10:64) [15:11:16:149]: Note: 1: 2205 2:  3: Error 
MSI (c) (10:64) [15:11:16:149]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 2867 
DEBUG: Error 2867:  The error dialog property is not set
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2867. The arguments are: , , 
MSI (c) (10:64) [15:11:16:154]: Font created.  Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg

Error 1723. There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor.  Action xxx.xxx.xxx.WindowsService.CustomAction, entry: SaveAppsettings, library: C:\Users\vsun\AppData\Local\Temp\MSIFC10.tmp 
MSI (c) (10:64) [15:11:17:024]: Note: 1: 2205 2:  3: Error 
MSI (c) (10:64) [15:11:17:024]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1709 
MSI (c) (10:64) [15:11:17:024]: Product: xxx xxx xxx (32 bit) -- Error 1723. There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor.  Action xxx.xxx.xxx.WindowsService.CustomAction, entry: SaveAppsettings, library: C:\Users\vsun\AppData\Local\Temp\MSIFC10.tmp 

Action ended 15:11:17: xxx.xxx.xxx.WindowsService.CustomAction. Return value 3.
MSI (c) (10:64) [15:11:17:025]: Note: 1: 2205 2:  3: Error 
MSI (c) (10:64) [15:11:17:025]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 2896 
DEBUG: Error 2896:  Executing action xxx.xxx.xxx.WindowsService.CustomAction failed.
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2896. The arguments are: xxx.xxx.xxx.WindowsService.CustomAction, , 

Пользовательское действие

using System;
using System.Collections.Generic;
using System.Text;
using xxx.xxx.xxx.xxx.Models;
using Microsoft.Deployment.WindowsInstaller;
using Newtonsoft.Json;
using System.IO;

namespace xxx.xxx.xxx.WindowsService.CustomAction
{
    public class CustomAction
    {
        [CustomAction]
        public static ActionResult SaveAppsettings(Session session)
        {
            // Pull values from installer
            string keyVaultConnectionString = session["KeyVaultConnectionString"];
            string keyVaultUrl = session["KeyVaultUrl"];


            return ActionResult.Success;
        }
    }
}

Извините, если xxx сбивает с толку. По соображениям безопасности я должен заменить часть контекста.


person boboobobo    schedule 24.01.2019    source источник
comment
Создание настраиваемого действия - это лучший способ. Пожалуйста, вставьте свой код Wix, код CA и полученную ошибку.   -  person Isaiah4110    schedule 24.01.2019
comment
Если файл конфигурации представляет собой XML-файл, вы могли бы использовать XMLFILE ELEMENT, но так как его настраиваемое действие JSON - это то, что вам нужно.   -  person Isaiah4110    schedule 24.01.2019
comment
@ Isaiah4110 Я добавил код из продукта и журнал ошибок из MSI, для центра сертификации все, что он делает сейчас, - это вводит входные данные. Если есть еще что-то, что вам нужно, чтобы лучше понять, в чем моя проблема, пожалуйста, дайте мне знать   -  person boboobobo    schedule 24.01.2019
comment
Итак, настраиваемое действие не работает, это все, что я могу понять из этого. Можете ли вы также вставить код CA? Мне нужно понимать, что происходит внутри CA.   -  person Isaiah4110    schedule 24.01.2019
comment
Ладно, извините, я только что добавил код CA   -  person boboobobo    schedule 24.01.2019
comment
У вас есть настраиваемое действие (xxx.xxx.xxx.WindowsService.CustomAction), определенное в отдельном файле?   -  person Isaiah4110    schedule 24.01.2019
comment
да, я определил это в моем диалоговом окне ввода   -  person boboobobo    schedule 24.01.2019


Ответы (1)


Похоже, вы не включаете свою DLL-файл с настраиваемым действием в свой код Wix. Пожалуйста, попробуйте следующее и обязательно включите вашу CA dll. Отредактируйте имя / точку входа CA dll и т. Д. В соответствии с вашим кодом.

    <Fragment>
      <CustomAction Id='xxx.xxx.xxx.WindowsService.CustomAction' BinaryKey='CA123' DllEntry='SaveAppsettings' Execute='immediate'
                    Return='check'/>

      <Binary Id='CA123' SourceFile='xxx.xxx.xxx.WindowsService.CustomAction.dll'/>
   </Fragment>
person Isaiah4110    schedule 24.01.2019
comment
Привет, я нашел проблему. Я не использовал makefxca.exe в своей dll, чтобы получить необходимый ca.dll. Хотя я не уверен, как заставить это работать с Visual Studio вместо того, чтобы запускать его через командную строку каждый раз, когда я создаю настраиваемое действие. - person boboobobo; 24.01.2019
comment
@boboobobo файл Wix.CA.targets определяет цель PackCustomAction. Если вы только что создали обычный проект C # в Visual Studio, он не будет импортировать этот целевой файл. Есть два варианта: переделать проект как набор инструментов WiX ›C # Custom Action Project для WiX v # или вручную вставить импорт в существующий проект. Вероятно, проще всего будет просто создать сам проект и просто переместить / скопировать и вставить ваш код в новый проект. Это позволит вашей сборке автоматически запускать makefxca.exe в dll настраиваемого действия. - person Brian Sutherland; 25.01.2019
comment
Вот что интересно. Проект CA - это проект настраиваемого действия C # для Wix v3, и создаваемая им dll настраиваемого действия вызывает проблему с DLL в установщике. Но когда я сам запускаю Makesfxca с параметрами и использую их в установщике, никаких проблем не возникает. Хотя прямо сейчас у меня проблема, когда моя служба по какой-то причине не добавляется в реестр, поэтому мне нужно сделать шаг назад, и я больше не могу задавать вопросы о SO из-за их правил - person boboobobo; 25.01.2019