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

标签 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(.NET 4.5.1 上的 2013 更新 2)

或者 Xaml 设计器只是在查找错误的程序集。

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

非常感谢您抽出宝贵时间。

最佳答案

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

这个问题的唯一解决办法是区分设计时的返回值和运行时的返回值。

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

参见 PerrypheralFramework

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

关于c# - 自定义 MarkupExtension 仅在设计时导致 TypeInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216528/

相关文章:

wpf - MVVM 模式 - 执行 View 操作

c# - DataTemplateSelector CreateContent 抛出 InvalidOperationException

C#反射: How to set nested Property of nested Lists

c# - 在 C# 中导入 PowerShell 模块

c# - Label.Content 无法正常工作

xaml - 无法将字符串转换为字符串

c# - 如何从另一个 WinForm 通过 C# WinForm 查看

wpf - View 模型重新加载绑定(bind)数据时如何显示 'Loading...' 覆盖

wpf - 将数据网格绑定(bind)到 SQLite

c# - 将 GUI 导出为 XML?