仅当 XML 发生更改时才从 XML 生成 C# 类

发布于 2025-01-06 11:16:07 字数 239 浏览 0 评论 0原文

我在 C# 项目上有一个预构建事件,该项目运行 xsltproc 将一些 XML 转换为 C# 源文件。然后以正常方式构建生成的源。这意味着无论 XML 是否发生变化,项目总是会被构建。

有没有办法仅在 XML 发生更改时生成 C# 类?预构建事件是错误的方法吗?使用某种自定义工具将 XML 转换为 C# 会更好吗?

我使用的是 Visual Studio 2010。XML 不包含序列化对象。

非常感谢任何帮助。

I have a pre-build event on a C# project which runs xsltproc to transform some XML into C# source files. The generated source then gets built in the normal way. This means that the project always gets built regardless of whether the XML has changed.

Is there a way of only generating the C# classes if the XML has changed? Is a pre-build event the wrong approach? Would I be better off with a custom tool of some kind to turn the XML into C#?

I'm using Visual Studio 2010. The XML doesn't contain serialized objects.

Any help much appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏尔 2025-01-13 11:16:07

最后,我在 csproj 文件中添加了一个新的 ItemGroup,其中包含对每个 XML 文件的引用。我为每个项目指定了 Preprocess 元素名称:

<ItemGroup>
  <Preprocess Include="Xml\MySourceXmlFile1" />
  <Preprocess Include="Xml\MySourceXmlFile2.xml" />
</ItemGroup>

稍后在项目文件中,我覆盖了 BeforeBuild 目标,以便它将每个 Preprocess 项目转换为与 XML 文件同名的 C# 源文件:

<Target Name="BeforeBuild"
  Inputs="@(Preprocess)"
  Outputs="@(Preprocess->'$(ProjectDir)%(Filename).cs')">
  <Exec Command="xsltproc -o %22$(ProjectDir)%(Filename).cs%22 %22MyTransform.xsl%22 @(Preprocess)" />
</Target>

请注意 xsltproc 的参数必须是与 %22 一起逃脱。

现在,仅当 XML 发生更改时才会构建 C# 源文件。我从论坛帖子中获得了该方法。

In the end I added a new ItemGroup to my csproj file with references to each XML file. I gave each item an element name of Preprocess:

<ItemGroup>
  <Preprocess Include="Xml\MySourceXmlFile1" />
  <Preprocess Include="Xml\MySourceXmlFile2.xml" />
</ItemGroup>

Later in the project file I overrode the BeforeBuild target, so that it transforms every Preprocess item into a C# source file with the same name as the XML file:

<Target Name="BeforeBuild"
  Inputs="@(Preprocess)"
  Outputs="@(Preprocess->'$(ProjectDir)%(Filename).cs')">
  <Exec Command="xsltproc -o %22$(ProjectDir)%(Filename).cs%22 %22MyTransform.xsl%22 @(Preprocess)" />
</Target>

Note the arguments to xsltproc have to be escaped with %22.

Now the C# source file is only built if the XML has changed. I got the approach from this forum post.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文