【问题标题】:Updated custom generated files on save在保存时更新了自定义生成的文件
【发布时间】:2024-01-15 05:06:01
【问题描述】:

.xaml 文件中添加新控件后,我就可以在xaml.cs 文件中引用它,因为VS 很友好地在g.i.cs 文件中为其生成C# 代码。

例如

在 MainWindow.xaml 我添加

<Grid>
    <Button x:Name="Test"/>
</Grid>

我可以像这样从 MainWindow.xaml.cs 访问它

this.Test.Content = "TestButton";

因为VS在包含的obj文件夹中生成了MainWindow.g.i.cs

internal System.Windows.Controls.Button Test;

我已经能够使用 msbuild 对自定义文件 .xyz 具有完全相同的行为,这是 .cs 文件的设计器视图。我已经创建了一个 msbuild 目标,它在构建和项目加载时重新生成 .cs 文件,但我无法在文件保存时做同样的事情

现在我的问题:

  1. VS 如何在保存时重新生成g.i.cs
  2. 这是 VS 功能还是 msbuild 功能?
  3. 我可以在保存时触发增量构建吗?

更新:

我还查看了 WPF .csproj,它使用与类库 C# 项目相同的 .targets 文件。我能发现的唯一区别是 DependentUponSubType 项目元数据

【问题讨论】:

    标签: c# .net wpf visual-studio msbuild


    【解决方案1】:
    1. VS 如何在保存时重新生成 g.i.cs?

    AFAIK,Visual Studio 调用 XAML 编译器 xamlc.exe 来编译 XAML 文件,并在保存时重新生成 g.i.cs

    查看此博客Understanding In and Out of XAML in WPF

    在博客中,作者说 XAML 的编译分两步进行:

    步骤 1。第一步是使用 xamlc.exe 编译器将 XAML 文件编译为 BAML。例如,如果我们的项目包含一个名为 Window1.xaml 的文件,编译器将创建一个名为 Window1.baml 的临时文件并将其放在 obj\Debug 子文件夹(在我们的项目文件夹中)。同时,使用我们选择的语言为我们的窗口创建一个局部类。例如,如果我们使用 C#,编译器将在 obj\Debug 文件夹中创建一个名为 Window1.g.cs 的文件。 g 代表生成。

    第 2 步。当 XAML 到 BAML 编译阶段完成后,Visual Studio 使用适当的语言编译器来编译我们的代码并 生成的部分类文件。对于 C# 应用程序, 处理此任务的是 csc.exe 编译器。编译后的代码 成为单个程序集 Window1.exe),每个窗口的 BAML 为 作为单独的资源嵌入。

    .

    1. 这是 VS 功能还是 msbuild 功能?

    这应该是 Visual Studio 的功能。正如我上面所说,Visual Studio 在保存时调用 XAML 编译器 xamlc.exe 来编译 .xaml 文件。 Visual Studio 将调用 MSBuild 将这些文件编译为 .exe/.dllon build。另外,当你保存不建项目时,你可以打开你的任务管理器,没有MSBuild.exe存在,只有当你建项目时,它才会出现。所以这应该是 Visual Studio 功能而不是保存时的 MSBuild。

    1. 我可以在保存时触发增量构建吗?

    在 Visual Studio 中,构建系统支持增量构建。但是如果你想用你的自定义 MSBuild 文件.xyz 触发增量构建,恐怕你不能这样做,因为 MSBuild 只适用于构建而不是保存。

    [!INCLUDETLA2#tla_wpf] 构建系统提供对增量构建的支持。它在检测对标记或代码所做的更改方面相当智能,并且它仅编译受更改影响的那些工件。增量构建机制使用以下文件

    查看Building a WPF Application (WPF)了解更多详情。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢您的回复,任务管理器和MSBuild这部分我真的没有想到。我想进一步研究它,但如果我没有解决方案,我会将您的解决方案标记为正确的。