我正在开发自定义标记扩展,其作用很简单:
在扩展构造函数参数(一种类型)上使用 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.WPF, 相关类是:PerrypheralFramework.WPF.MarkupExtensions.Base.DependencyObjectDependantExtensionBase
关于c# - 自定义 MarkupExtension 仅在设计时导致 TypeInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216528/