我正在做一个自定义标记扩展,它的作用很简单:
使用系统。在扩展构造函数参数(类型)上激活并实例化它。
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 update 2 on。net 4.5.1)
或者Xaml设计器只是在错误的程序集中查找。
关于如何解决这个问题,或者其他任何关于这个问题的想法,也许?
非常感谢您的宝贵时间。
我对这个问题进行了深入研究,得出以下结论:
这个问题的唯一解决方案是区分设计时的返回值和运行时的返回值。
这是相当容易做到的,并在我正在开发的WPF框架中实现。
看到PerrypheralFramework
相关的程序集是PerrypheralFramework。WPF,相关的类是:PerrypheralFramework.WPF.MarkupExtensions.Base.DependencyObjectDependantExtensionBase