Я пишу плагин для приложения (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'.