【问题标题】:XmlnsDefinition for recursive namespaces递归命名空间的 XmlnsDefinition
【发布时间】:2011-01-07 15:05:29
【问题描述】:

我有一个项目,它由一个名为 ViewParts 的 .net 命名空间构成。另一方面,这由许多不同的子文件夹组成,其中包含 wpf 用户控件。

我已将 XmlnsDefinition 属性添加到我的 AssemblyInfo.cs 文件中,以将该 .net 命名空间映射到 uri 以在其他窗口/用户控件文件中使用。但我真的很想让属性在“递归模式”下工作。那就是:我希望它包含我指定的 .net 命名空间下的所有子文件夹。 否则,我将不得不进入 AssemblyInfo.cs 文件并在每次添加新的 viewpart/usercontrol 时添加一行,这只是另一个步骤-将-get-forgotten...

这有可能吗?

【问题讨论】:

    标签: .net wpf xml


    【解决方案1】:

    一切皆有可能。

    不过,在这种情况下,这并不是特别容易。 XmlnsDefinition 属性由 XAML 解析器直接读取,它没有递归命名空间功能。除非您的程序集实际上具有 XmlnsDefinition 属性,否则 XAML 解析器不会将它们添加到其表中,并且您将无法获得所需的映射。

    修改 XAML 解析器不是一个好主意,因为您需要处理的内部结构可能会发生变化。幸运的是,自动添加 XmlnsDefinitions 并不难。

    我将提供三种方法来修改构建过程以实现自动化。在每种情况下,您首先将要递归的XmlnsDefinition 属性从AssemblyInfo.cs 中移出,并移到另一个由您的构建步骤重写的文件中。这是可能的,因为可以在任何文件中找到 [assembly:] 属性。无论在哪里找到它们,C# 编译器都会将它们添加到生成的程序集中的相同位置。

    既然您的文件是一个单独的文件,这里有三种方法可以在您每次按 F5 或 Ctrl-Shift-B 或其他任何方式时自动重建它:

    1. 添加一个加载 .dll 的构建后事件,使用反射枚举类型,并构建具有所需前缀的命名空间列表。将此写入您的“XmlnsDefinitions.cs”文件(还必须删除只读位),以便下次编译时将具有正确的定义。缺点:与源代码管理的交互性差,必须编译两次才能获得正确的输出。

    2. 添加一个构建任务(参考Microsoft.Build.Framework 和子类Microsoft.Build.Framework.Task),通过解析源代码将“XmlDefinitions.cs”文件构造为生成文件。在您的 .csproj 文件中(或在您的 .csproj 中包含的单独的 .targets 文件中)包含对此任务的调用。缺点:比 #1 做更多的工作,为可能存在嵌套命名空间的命名空间编写源解析器。

    3. 添加一个构建任务,该任务通过反映 .dll 输出来构造“XmlnsDefinitions.cs”文件。然后添加一个自定义 .targets 文件,该文件在没有 XmlnsDefinitions.cs 的情况下编译您的应用程序,然后构建 XmlnsDefintions.cs,然后再次编译。缺点:构建过程复杂,msbuild变化复杂,因编译两次而显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2012-11-05
      • 1970-01-01
      • 2022-11-23
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多