Как использовать прагмы препроцессора 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
это должно показать путь.