Как использовать прагмы препроцессора WiX?

В настоящее время я работаю над тестовым проектом WiX, чтобы посмотреть, что я могу с ним сделать.

Недавно я наткнулся на тот факт, что я могу переопределить ProcessPragma метод в моем расширении препроцессора, чтобы написать исходный код WiX во время компиляции. Наличие функции препроцессора, которая возвращает строку xml без компиляции, звучит здорово. Поэтому я изучил это, но ответ в этой ветке пользователей wix довольно краткий и мало что объясняет. Google не возвращает ничего интересного. Поэтому я покопался в исходном коде 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 prefix.name args?> где аргументы - это просто строка. И как примечание, вы не закрываете XmlWriter в вашем методе переопределения.

1 ответ

Во-первых, убедитесь, что вы передаете -ext path\to\YourPragmaExtensionAssembly.dll в candle.exe, Свеча загрузит ваше расширение, ищите AssemblyDefaultWixExtension атрибут, который указывает на класс, который наследует от WixExtension, а затем спросите PreprocessorExtension класс, если вы переопределите PreprocessorExtension имущество.

Это небольшая проводка, которая может быть упрощена в будущих версиях (например, v4.0) набора инструментов WiX. Но есть пример в наборе инструментов WiX v3.x по адресу: src\ext\PreProcExampleExtension\wixext это должно показать путь.

Другие вопросы по тегам