.net 递归名称空间的XmlnsDefinition

.net 递归名称空间的XmlnsDefinition,.net,wpf,xml,.net,Wpf,Xml,我有一个名为ViewParts的.net命名空间结构的项目。另一方面,它由许多不同的子文件夹组成,其中包含wpf用户控件 我已向AssemblyInfo.cs文件添加了一个XmlnsDefinition属性,以将该.net命名空间映射到uri,以便在其他窗口/用户控制文件中使用。但我真的很想让属性在“递归模式”下工作。也就是说:我希望它包括我指定的.net命名空间下的所有子文件夹。 否则,每次添加新的viewpart/usercontrol时,我都必须进入AssemblyInfo.cs文件并添加

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

我已向AssemblyInfo.cs文件添加了一个XmlnsDefinition属性,以将该.net命名空间映射到uri,以便在其他窗口/用户控制文件中使用。但我真的很想让属性在“递归模式”下工作。也就是说:我希望它包括我指定的.net命名空间下的所有子文件夹。 否则,每次添加新的viewpart/usercontrol时,我都必须进入AssemblyInfo.cs文件并添加一行,这只是又一个会被遗忘的步骤

这在任何方面都是可能的吗?

任何事情都是可能的

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

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

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

既然您的文件是一个单独的文件,下面是每次按F5或Ctrl-Shift-B或其他键时自动重建文件的三种方法:

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

  • 添加一个生成任务(参考
    Microsoft.build.Framework
    和子类
    Microsoft.build.Framework.task
    ),通过解析源代码将“XmlDefinitions.cs”文件构造为生成的文件。在.csproj文件(或包含在.csproj中的单独.targets文件)中包含对此任务的调用。缺点:工作比#1多,为名称空间编写源解析器由于嵌套名称空间的可能性而变得复杂

  • 添加一个生成任务,该任务通过反映.dll输出来构造“XmlnsDefinitions.cs”文件。然后添加一个自定义的.targets文件,该文件在不使用XmlnsDefinitions.cs的情况下编译应用程序,然后构建XmlnsDefinitions.cs,然后再次编译。缺点:复杂的生成过程,复杂的msbuild更改,由于编译两次而显示