IniFileSearch使用WixSharp

时间:2015-09-22 23:42:13

标签: wix windows-installer wixsharp

我是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>

1 个答案:

答案 0 :(得分:2)

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

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

因此,在Managed 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(或/和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