IniFileSearch с помощью WixSharp

Я новичок в Wix и WixSharp. Недавно я изучил Wix и создал с его помощью базовый установщик. Одним из свойств, которые я использовал, было «IniFileSearch», которое помогло мне найти значение в IniFile и использовать его для поиска места установки моих файлов. Я пытаюсь сделать то же самое с помощью WixSharp, но, похоже, не могу найти эквивалентный метод. Самое близкое, что я смог найти в WixSharp, — это класс «AppSearch» (в разделе WixSharp.CommonTasks). Из Wix я знаю, что «AppSearch» — это таблица базы данных MSI, в которой хранятся задачи поиска. «IniFileSearch» — один из таких поисков. Я даже не уверен, что класс «AppSearch» в библиотеке WixSharp напрямую сопоставлен с таблицей базы данных MSI «AppSearch». В любом случае, моя цель — найти эквивалентный метод «IniFileSearch» в библиотеке WixSharp. Если кто-нибудь знает это, пример был бы замечательным.

Вот пример IniFileSearch в разметке Wix

<Property Id="MY_PROPERTY">
 <IniFileSearch Id="myIniSearch"
                Name="myConfigFile.ini"
                Section="section1"
                Key="name"
                Type="raw" />
</Property>

person aniketgade    schedule 22.09.2015    source источник


Ответы (1)


Вот ответ, который я получил от Олега Шило, создателя WixSharp.

Поскольку Wix# многое делает по-другому, такие задачи, как «свойство MSI IniFileSearch», почти не имеют отношения к истории Wix#. В любом случае, что касается Wix#, то RegValueProperty — это единственная задача MSI «Поиск приложений», которую он изначально поддерживает. Вместо этого Wix# позволяет вам указать подпрограмму C#, в которой вы можете выполнять ЛЮБОЙ поиск/анализ, не привязываясь к функциям MSI.

Таким образом, в управляемом ЦС вы можете прочитать свой reg-файл с помощью любого алгоритма C# по вашему выбору и просто обновить свойство сеанса по своему усмотрению:

public class CustomActions
{
    [CustomAction]
    public static ActionResult MyAction(Session session)
    {
        session["EnvVersion"] = AppSearch.IniFileValue(Environment.ExpandEnvironmentVariables(@"%windir%\win.ini"),
                                                       "System",
                                                       "Version");
    }
}

В приведенном выше коде я использовал процедуру поиска IniFileValue, которую Wix# уже реализует, но вы можете использовать любую альтернативную реализацию. Даже взаимодействие GetProfileString(...).

Если вы используете управляемую установку, вам нужно будет поместить свое действие в обработчик событий UIInitialized (или/и Load):

project.UIInitialized += project_UIInit;
...
static void project_UIInit(SetupEventArgs e)
{
    e.Session["EnvVersion"] = AppSearch.IniFileValue(Environment.ExpandEnvironmentVariables("%windir%\\config.ini"),
                                                     "System",
                                                     "Version") ?? "<unknown>"; 
}  

Просто имейте в виду, что IniFileValue был добавлен совсем недавно, поэтому в настоящее время вы можете получить его только из NuGet в виде предварительного пакета:

Install-Package WixSharp.bin -Version 1.0.26
person aniketgade    schedule 24.09.2015
comment
Исправление: для IniFileValue требуется WixSharp 1.0.27. - person aniketgade; 29.09.2015
comment
Этот код кажется мне точным, и если кто-то и знает, так это Олег. Спасибо, что задали вопрос и разместили свой ответ. Знание о событии UIInitialized и о том, как написать для него обработчик времени выполнения, мне пригодится. Вы пробовали приведенный выше код, и выполнил ли он для вас необходимую задачу? - person Developer63; 17.11.2015