2010-01-21 6 views
1

У меня есть проект, который структурирован с пространством имен .net под названием ViewParts. Это, с другой стороны, состоит из множества различных подпапок с пользовательскими настройками wpf.XmlnsDefinition для рекурсивных пространств имен

Я добавил атрибут XmlnsDefinition в файл AssemblyInfo.cs для сопоставления этого пространства имен .net с uri для использования в других файлах window/usercontrol. Но мне бы очень хотелось, чтобы атрибут работал в «рекурсивном режиме». То есть: я хочу, чтобы он включал все подпапки под пространством имен .net, которое я указываю. В противном случае мне придется зайти в файл AssemblyInfo.cs и добавить строку каждый раз, когда я добавлю новый viewpart/usercontrol, и это просто еще один шаг, который будет зависеть ...

Это возможно в любом случае?

ответ

2

Все возможно.

В этом случае, однако, это не особенно легко. 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 (или в отдельный файл .targets, который включен в ваш .csproj). Недостатки: больше работы, чем # 1, написание исходного анализатора для пространств имен, осложненных возможностью вложенных пространств имен.

  3. Добавить задачу сборки, которая создает файл «XmlnsDefinitions.cs», отражая вывод .dll. Затем добавьте пользовательский файл .targets, который компилирует ваше приложение без XmlnsDefinitions.cs, затем создаст XmlnsDefintions.cs, а затем снова скомпилируется. Недостатки: сложный процесс сборки, сложные изменения msbuild, показывают из-за компиляции дважды.

Смежные вопросы