2009-06-07 3 views
0

У меня есть WPF MarkupExtension, которому необходимо получить доступ к ресурсам в сборке ресурсов по умолчанию. Расширение работает нормально во время выполнения, но не работает в дизайнере, поскольку расширение не может найти ресурсы по умолчанию в сборке запуска. Чтобы загрузить ResourceManager, мне нужно знать, какую сборку нужно загрузить из ресурсов.Поиск сборки запуска во время разработки в WPF

Во время выполнения я могу легко справиться с этим, передав сборку при инициализации - это работает отлично.

Однако во время разработки ни один из этих кодов запуска не запускается, поэтому разработчик бомбит и не загружает страницу. Так как я могу получить один из следующих обобщенно (без ссылок на конкретные типы приложений):

  • запуска сборки приложения (т. Е МОФ EXE)
  • Текущий XAML Документирование Extension Markup размещен на

ответ

2

AFAIK, нет простого и чистого способа сделать это ... Я использую следующий метод, который ищет сборку, которая имеет точку входа (т.е. исполняемую сборку) и содержит класс, полученный из System.Windows .Application:

public static Assembly GetEntryAssembly() 
    { 
     // Should work at runtime 
     Assembly asm = Assembly.GetEntryAssembly(); 

     // Design time 
     if (asm == null) 
     { 
      asm = (
        from a in AppDomain.CurrentDomain.GetAssemblies() 
        where a.EntryPoint != null 
        && a.GetTypes().Any(t => t.IsSubclassOf(typeof(System.Windows.Application))) 
        select a 
       ).FirstOrDefault(); 
     } 

     return asm; 
    } 

необходим этот код будет скорректирована с учетом конкретных потребностей (например, он не будет работать для библиотеки управления WPF)

Если вы хотите, чтобы получить корневой элемент XAML, вы могли бы найти вдохновение в code of a markup extension Я написал некоторое время назад. Он находит корневой элемент, используя отражение в частных/внутренних полях.

+0

Ах да, я нашел свойства контекста до и отклонил с помощью частного отражения. Но теперь, когда я думаю об этом сценарии, в первую очередь для дизайнера, поэтому проблемы с доверием не должны быть проблемой. Спасибо, я думаю, это указывает на меня в правильном направлении. –

+0

Приведенный выше код работает в дизайнере и находит сборку запуска. Это все еще оставляет элементы управления в других сборках, но это довольно незначительно - по умолчанию расширение разметки может справиться с этим. FWIW, частный код отражения в вашем сообщении полезен, но, к сожалению, он не работает в дизайнере. Очевидно, что дизайнер работает в частичном доверии, и попытка частного рефлекса терпит неудачу. Мало того, что он полностью отменяет код - блок исключений не захватывает его. –

+0

Странно ... для меня это не разбивает дизайнера. Во всяком случае, это просто грязное решение для привязки команд InputBinding к командам ViewModel. –

0

Assembly.GetEntryAssembly.FullName даст вам №1. Для вашей другой проблемы не будет сборка Assembly.GetExecutingAssembly?

+0

Это работает во время выполнения, но не во время разработки, так как дизайнер принимает приложение. Мне нужно получить ссылку на стартовую сборку во время разработки. Проблема заключается в расширении разметки в отдельной сборке. Сейчас я переместил его в главную сборку и ссылаюсь на сборку таким образом - это работает, но мне действительно нужно иметь расширение в отдельной сборке. –

+1

GetEntryAssembly возвращает null во время разработки ... –

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