C# WiX预处理器<;?定义?>;用C语言编程创建

C# WiX预处理器<;?定义?>;用C语言编程创建,c#,wix,C#,Wix,我有一个WiX文件,它是自动和编程更新的。该文件需要添加一个define标记,但我找不到使用C#执行此操作的方法。每次我尝试添加一个元素时,它都会说它不包含在根元素中(这是真的,因为“define”是一个预处理器命令,不包含在根元素中)。为了编辑XML标记(也是预处理器),有内置的功能。有人知道define是否还有内置功能吗?谢谢你的帮助 我认为您必须在“文本”模式下编辑文件,而不是在XML模式下。 一种可能的解决方案是以XML模式在文件中插入特殊标记,例如 <a_very_special

我有一个WiX文件,它是自动和编程更新的。该文件需要添加一个define标记,但我找不到使用C#执行此操作的方法。每次我尝试添加一个元素时,它都会说它不包含在根元素中(这是真的,因为“define”是一个预处理器命令,不包含在根元素中)。为了编辑XML标记(也是预处理器),有内置的功能。有人知道define是否还有内置功能吗?谢谢你的帮助

我认为您必须在“文本”模式下编辑文件,而不是在XML模式下。 一种可能的解决方案是以XML模式在文件中插入特殊标记,例如

<a_very_special_marker/>


然后替换文件文本上的这些标记。

我认为您必须在“文本”模式下编辑文件,而不是在XML模式下编辑文件。 一种可能的解决方案是以XML模式在文件中插入特殊标记,例如

<a_very_special_marker/>


然后在文件文本上的这些标记上进行替换。

如果使用的是XmlWriter,请使用编写处理指令。如果您使用的是XSLT,请使用。如果您使用不同的C#机制来创建XML,请告诉我们-大多数机制都有创建处理指令的功能。

如果您使用的是XmlWriter,请使用来编写处理指令。如果您使用的是XSLT,请使用。如果您使用不同的C#机制来创建XML,请告诉我们-大多数机制都有创建处理指令的功能。

这里有一个用于相同任务的函数

static void WritePreProcessor(Parameters p)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(p.InputXml);
    XmlProcessingInstruction pi = doc.CreateProcessingInstruction(p.Name, p.Value);
    XmlNode root = doc.DocumentElement;
    doc.InsertBefore(pi, root);
    doc.Save(p.OutputXml);
}
使用p.Name=“define”和p.Value=“SourceDir=…\build”,结果如下

<?xml version="1.0" encoding="utf-8"?>
<?define SourceDir=..\..\build?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
  ...
  </Fragment>
</Wix>

...

这是一个我用于相同任务的函数

static void WritePreProcessor(Parameters p)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(p.InputXml);
    XmlProcessingInstruction pi = doc.CreateProcessingInstruction(p.Name, p.Value);
    XmlNode root = doc.DocumentElement;
    doc.InsertBefore(pi, root);
    doc.Save(p.OutputXml);
}
使用p.Name=“define”和p.Value=“SourceDir=…\build”,结果如下

<?xml version="1.0" encoding="utf-8"?>
<?define SourceDir=..\..\build?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
  ...
  </Fragment>
</Wix>

...

谢谢您的快速回答。那对我来说太乱了。我想这是可能的,但是我通过XML方法处理WiX文件还有很多其他工作要做,要将整个内容解析为文本,添加一个标记,然后将其重新解析为XML并不完全符合我的需要。谢谢你的建议。谢谢你的快速回答。那对我来说太乱了。我想这是可能的,但是我通过XML方法处理WiX文件还有很多其他工作要做,要将整个内容解析为文本,添加一个标记,然后将其重新解析为XML并不完全符合我的需要。不过谢谢你的建议。目前我只使用XDocument.save(字符串文件名)保存XML,你知道它是否有创建处理指令的功能吗?@Adkins我不熟悉XDocument api,但它似乎有一种机制来获取文档中的节点列表(子节点),您可以调用
document.degentNodes.First().AddBeforeSelf(新的XProcessingInstruction(“define”,“whatever”))
或类似的方法,将处理指令添加到文档的开头。实际的元素如下所示:WXSFile.AddFirst(新的XProcessingInstruction(“define”,“whatever”);谢谢你的帮助。你真的把我推向了正确的方向。目前我只使用XDocument.save(字符串文件名)保存XML,你知道它是否有创建处理指令的功能吗?@Adkins我不熟悉XDocument api,但它似乎有一种机制来获取文档中的节点列表(后代节点),您可以调用
document.degentNodes.First().AddBeforeSelf(新的XProcessingInstruction(“define”,“whatever”))
或类似的方法,将处理指令添加到文档的开头。实际的元素如下所示:WXSFile.AddFirst(新的XProcessingInstruction(“define”,“whatever”);谢谢你的帮助。你真的把我推向了正确的方向。你应该看看我在codeplex“Fireworks”和“IsWiX”上的开源项目。它们提供了一个使用Linq to XML(XDocument)作为DOM创建XML设计器的平台。里面有各种各样的解析WiX源代码的例子,你应该看看我在codeplex“Fireworks”和“IsWiX”上的开源项目。它们提供了一个使用Linq to XML(XDocument)作为DOM创建XML设计器的平台。其中有各种解析WiX源代码的示例。