1

我目前正在做一个测试 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覆盖方法中的 。

4

1 回答 1

0

首先,确保您正在传递-ext path\to\YourPragmaExtensionAssembly.dllto candle.exe。Candle 将加载您的扩展,查找AssemblyDefaultWixExtension指向从 WixExtension 继承的类的属性,然后PreprocessorExtension在您覆盖该PreprocessorExtension属性时询问您的类。

在 WiX 工具集的未来版本(如 v4.0)中可以简化一些接线。但是在 WiX v3.x 工具集中有一个示例:src\ext\PreProcExampleExtension\wixext那应该可以说明问题。

于 2013-02-27T14:55:03.333 回答