2

我是 Wix 和 WixSharp 的新手。我最近学习了 Wix 并用它创建了一个基本的安装程序。我使用的属性之一是“IniFileSearch”,它帮助我从 IniFile 中搜索一个值并使用它来查找我的文件的安装位置。我正在尝试使用 WixSharp 做同样的事情,但似乎没有找到等效的方法。我在 WixSharp 中能找到的最接近的东西是“AppSearch”类(在 WixSharp.CommonTasks 下)。从 Wix 我知道“AppSearch”是存储搜索任务的 MSI 数据库表。“IniFileSearch”是这些搜索之一。我什至不确定 WixSharp 库中的“AppSearch”类是否直接映射到“AppSearch”MSI 数据库表。无论如何,我的目标是在 WixSharp 库中找到“IniFileSearch”等效方法。如果有人知道,

这是 Wix 标记中的示例 IniFileSearch

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

1 回答 1

2

这是我从 WixSharp 的创建者 Oleg Shilo 那里得到的答案。

因为 Wix# 做许多不同的事情,例如“MSI IniFileSearch 属性”之类的任务与 Wix# 的故事几乎无关。无论如何,就 Wix# 而言,RegValueProperty 是它本机支持的唯一 MSI“AppSearch”任务。相反,Wix# 允许您指定一个 C# 例程,您可以在其中进行任何搜索/分析,而不受 MSI 功能的约束。

因此,在托管 CA 中,您可以使用您选择的任何 C# 算法读取您的 reg 文件,并根据需要更新会话属性:

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

在上面的代码中,我使用了 Wix# 已经实现的 IniFileValue 查找例程,但您可以使用任何替代实现。甚至互操作 GetProfileString(...)。

如果您使用托管设置,那么您需要将您的操作放在 UIInitialized(或/和加载)事件处理程序中:

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
于 2015-09-24T16:49:16.243 回答