使用MEF时Type.GetType返回null

我目前正在将MEF用于导入插件的项目,因为这些插件是用WPF编写的,因此每个插件都有一个视图和一个视图模型.插件知道视图模型,但是主外壳UI会使用配置类型模式上的约定来构造视图并绑定视图模型.

我使用了Build-your-own-MVVM-framework示例中的一些代码来执行自动视图发现:

    [ImportMany(typeof(IPlugin))]
    public IEnumerable<IPlugin> Plugins { get; set; }

   var viewTypeName = this.Plugins.First().ViewModel.GetType().AssemblyQualifiedName.Replace("Model", string.Empty);
   var viewType = Type.GetType(viewTypeName,true);

目前的代码只是获取第一个插件,并从名称中取出Model,返回视图名称并获取视图类型,以便我可以构造它.因此,viewType的示例是:

PluginTest.TestView, PluginTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

但是,当我调用Type.GetType(viewType)时,我返回null,如果我添加true引发异常,则会得到异常:

Could not load file or assembly 'PluginTest, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=null' or one of its dependencies. 
The system cannot find the file specified.

即使已经使用MEF加载了它.

如果我做:

var types = Assembly.GetAssembly(this.Plugins.First().ViewModel.GetType()).GetTypes();

我返回了插件程序集中所有类型的列表,到目前为止,只有PluginTest.TestView和PluginTest.TestViewModel

有人可以帮我吗?

编辑:对不起,之前没有提到,这些插件与我的主Shell应用程序位于不同的程序集中.

解决方法:

做这样的事情可能是最简单的:

var modelType = this.Plugins.First().ViewModel.GetType();
var viewTypeName = modelType.FullName.Replace("Model", string.Empty);
var viewType = modelType.Assembly.GetType(viewTypeName);

我不确定为什么Type.GetType对您不起作用-程序集解析是一个棘手的问题-但如果您知道该程序集无论如何都应该定义类型,我肯定会改用Assembly.GetType.

上一篇:编译为JavaScript时,是否可以在Haxe中使用别名类型?


下一篇:c-无法再打印pi的小数