我目前正在做一个测试 WiX 项目,看看我能用它做什么。
最近,我偶然发现了这样一个事实,即我可以ProcessPragma
在我的预处理器扩展中覆盖该方法以在编译时编写 WiX 源代码。有一个预处理器函数可以返回一个 xml 字符串,而编译器不会发疯,这听起来很不错。所以我调查了它,但是这个 wix-users 线程中的响应非常简短,并没有解释太多。除此之外,谷歌不会返回任何有趣的东西。因此,我挖掘了 WiX 源代码以了解更多信息。
该方法的xml文档如下:
/// <summary>
/// Processes a pragma defined in the extension.
/// </summary>
/// <param name="sourceLineNumbers">The location of this pragma's PI.</param>
/// <param name="prefix">The prefix of the pragma to be processed by the extension.</param>
/// <param name="pragma">The name of the pragma.</param>
/// <param name="args">The pragma's arguments.</param>
/// <param name="writer">The xml writer.</param>
/// <returns>false if the pragma is not defined.</returns>
/// <comments>Don't return false for any condition except for unrecognized pragmas.
Throw errors that are fatal to the compile. use core.OnMessage for warnings and messages.</comments>
因此,作为测试,我让XmlWriter
生成了一个虚拟属性,然后返回 true。
现在,在我的 WiX 项目中实际调用它。在Preprocessor.cs
中,我发现了以下内容:
switch (reader.NodeType)
{
case XmlNodeType.ProcessingInstruction:
switch (reader.LocalName)
{
// other cases such as define, include, foreach,
// and other preprocessor directives
case "pragma":
this.PreprocessPragma(reader.Value, writer);
break;
}
break;
这暗示使用编译指示的语法是:<?pragma prefix.name?>
但这给了我以下警告:The pragma 'prefix.name' is unknown. Please ensure you have referenced the extension that defines this pragma.
我有一种感觉,我在正确的轨道上,因为它给了我一个与 pragma 相关的警告,但老实说,我不知道我在这里做什么。这似乎是一个未知的领域。
有谁知道我做错了什么,或者指出我正确的方向?
更新
似乎我的项目是问题所在。我在另一个项目中使用了我的扩展,它就像一个魅力。
对于将来阅读本文的任何人,语法就是<?pragma prefix.name args?>
参数只是一个字符串的地方。作为旁注,您不会关闭XmlWriter
覆盖方法中的 。