我正在为应用程序编写插件(如果您需要了解,可以使用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'.
答案 0 :(得分:3)
听起来我觉得你最好不要在单独的AppDomain
中进行编辑。然后,您可以在编译完成后抛出AppDomain
。
您的主AppDomain
和汇编AppDomain
之间的确切界面并不是我可以评论的内容,因为您没有在问题中提供详细信息。
答案 1 :(得分:2)
不知道如何清理缓存,但作为解决方法,我尝试直接使用XamlReader.Load加载XAML,看看它是否有效。 查看http://msdn.microsoft.com/en-us/library/ms590388.aspx#Y309