我有一个使用名为ViewParts的.net命名空间构建的项目。另一方面,这包含许多不同的子文件夹,其中包含wpf用户控件。
我在AssemblyInfo.cs文件中添加了一个XmlnsDefinition属性,将该.net命名空间映射到uri,以便在其他窗口/用户控制文件中使用。但我真的很想让属性在“递归模式”下工作。那就是:我希望它包含我指定的.net命名空间下的所有子文件夹。 否则,我将不得不进入AssemblyInfo.cs文件并在每次添加一个新的viewpart / usercontrol时添加一行,这只是另一步 - 将被遗忘......
这有可能吗?
答案 0 :(得分:2)
一切皆有可能。
但在这种情况下,并不是特别容易。 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的情况下编译您的应用程序,然后构建XmlnsDefintions.cs,然后再次编译。缺点:复杂的构建过程,复杂的msbuild更改,因为编译两次而显示。