如何清除插件项目中的WPF / XAML类型缓存

时间:2011-02-03 12:42:35

标签: wpf xaml assemblies xamlparseexception

我正在为应用程序编写插件(如果您需要了解,可以使用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 个答案:

答案 0 :(得分:3)

听起来我觉得你最好不要在单独的AppDomain中进行编辑。然后,您可以在编译完成后抛出AppDomain

您的主AppDomain和汇编AppDomain之间的确切界面并不是我可以评论的内容,因为您没有在问题中提供详细信息。

答案 1 :(得分:2)

不知道如何清理缓存,但作为解决方法,我尝试直接使用XamlReader.Load加载XAML,看看它是否有效。 查看http://msdn.microsoft.com/en-us/library/ms590388.aspx#Y309