自定义MarkupExtension仅在设计时导致TypeInitializationException

时间:2014-08-09 08:04:20

标签: c# wpf xaml reflection markup-extensions

我正在开发一个自定义标记扩展,其作用很简单:

在扩展构造函数参数(类型)上使用System.Activator并实例化它。

 public class MyExtension : MarkupExtension
 {
    private readonly Type _myType;

    public MyExtension (Type param)
    {
        _myType= param;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Activator.CreateInstance(_myType);
    }
 }

在运行时,此扩展按预期运行。

但在设计时,激活类型时会抛出异常。

我已经找到了源头,并抓住了鲸鱼:

    try
    {
        return Activator.CreateInstance(_myType);
    }
    catch (TypeInitializationException ex)
    {

    }

所以我循环了这个:

 (ex.InnerException as ReflectionTypeLoadException).LoaderExceptions[i].Message);

并检索以下消息

找不到Windows运行时类型'Windows.ApplicationModel.Core.IFrameworkView'。

无法找到Windows运行时类型'Windows.ApplicationModel.Core.IFrameworkViewSource'。

由于我的代码在运行时运行良好, 我唯一的猜测是VS(2013 4.5版更新2)

或者Xaml Designer只是在查看错误的程序集。

关于如何解决这个问题或任何其他问题的任何想法,或许?

非常感谢你抽出时间。

1 个答案:

答案 0 :(得分:0)

我已经进一步研究了这个问题并得出了以下结论:

此问题的唯一解决方案是区分设计时的返回值和运行时的返回值。

这很容易完成,并且是在我正在开发的WPF框架中实现的。

请参阅PerrypheralFramework

相关程序集是PerrypheralFramework.WPF, 相关的类是:PerrypheralFramework.WPF.MarkupExtensions.Base.DependencyObjectDependantExtensionBase