Как очистить кеш типа WPF / XAML в проекте плагина - PullRequest
4 голосов
/ 03 февраля 2011

Я пишу плагин для приложения (Autodesk Revit Architecture 2011, если вам нужно знать).

Во время отладки я хотел бы перекомпилировать свой плагин и перезагрузить его на хосте. Мой конкретный хост даже предоставляет диспетчер надстроек, который упрощает этот процесс, используя Assembly.Load. Для плагинов Windows.Forms это работает как шарм.

Когда я использую WPF, это ломается. Сначала я получал сообщение об ошибке (я добавил форматирование, чтобы вам было легче читать:

System.Windows.Markup.XamlParseException:  
[A]MyApp.Controls.MyControl cannot be cast to [B]MyApp.Controls.MyControl. 
Type A originates from 'MyApp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' at location '%PATHA%'. 
Type B originates from 'MyApp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' at location '%PATHB'.  
Error at object 'MyApp.Controls.MyControl' in markup file 'MyApp;component/controls/mydialog.xaml'.

Я также позволил себе переименовать элементы управления, пространства имен и пути, чтобы защитить невинного и меня, виновного.

Я предполагаю, что это потому, что синтаксический анализатор XAML хранит кэш уже загруженных типов.

Моим первым шагом было изменение версий сборки, установив AssemblyInfo.cs/[assembly: AssemblyVersion("2.0.*"). Это просто перемещает ошибку на шаг вперед:

System.Windows.Markup.XamlParseException:  
Unable to cast object of type 'MyApp.Controls.MyControl' to type 'MyApp.Controls.MyControl'.  
Error at object 'MyApp.Controls.MyControl' in markup file 'MyApp;component/controls/mydialog.xaml'. 
---> System.InvalidCastException: Unable to cast object of type 'MyApp.Controls.MyControl' to type 'MyApp.Controls.MyControl'.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Мне кажется, что вам лучше всего выполнить компиляцию в отдельном AppDomain. Затем вы можете выбросить это AppDomain после завершения компиляции.

Точный интерфейс между вашей основной AppDomain и компиляцией AppDomain s не является чем-то, что я могу прокомментировать, так как вы не предоставили детали в своем вопросе.

2 голосов
/ 11 февраля 2011

Не знаю, как очистить кеш, но в качестве обходного пути я бы попытался загрузить XAML напрямую с помощью XamlReader.Load и посмотреть, работает ли он. Чек http://msdn.microsoft.com/en-us/library/ms590388.aspx#Y309

...