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