【发布时间】:2011-02-21 22:24:17
【问题描述】:
我正在构建一个小型插件架构(不幸的是,MEF 不是一个选项,因为它需要在 .NET 2.0 上运行)。 我希望能够将 dll 放在一个目录中,而无需重新编译主项目。 我的主要项目是一个 winforms 应用程序,它有一些对话框来选择主程序需要的接口的实现。
我有一个方法可以搜索某个目录并给出我想要搜索实现该接口的类型的 dll 的位置列表。
public List<Type> GetPluginTypes()
{
List<Type> types = new List<Type>();
foreach (string dll in this.Plugins)
{
Assembly assembly;
try
{
assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dll));
}
catch
{
continue;
}
foreach (Type type in assembly.GetExportedTypes())
{
if (type.IsInterface || type.IsAbstract)
continue;
if (typeof(IMyInterface).IsAssignableFrom(type))
types.Add(type);
}
}
return types;
}
使用这种方法,我向用户展示了一个实现列表,其中一个被选中,它的 AssemblyQualifiedName 被保存到一个设置文件中。
当我启动主应用程序时,我从设置中加载 AQN,并通过调用上述方法将所有插件加载到 AppDomain 中。
string typeName = GetSetting("MyPlugin");
GetPluginTypes(); // just to load the plugins into the app domain
Type.GetType(typeName); // allways returns null.
这是我的问题:Type.GetType(typeName),总是返回 null。
我使用 Type.GetType(typeName, true) 来强制执行异常,我得到了: 无法加载文件或程序集“MyImpl,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。":"MyImpl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"}
我一无所知。我已经将程序集加载到AppDomain中,当我指定AQN时仍然找不到Type.GetType(string)。
【问题讨论】:
-
在 types.Add(type) 之后我设置了一个断点并使用即时窗口进行调试:AppDomain.CurrentDomain.GetAssemblies(),其中列出了 MyImpl 程序集,向下钻取还显示了类组装
-
另外,就在 types.Add(type) 之后,我调用了
Type type2 = Type.GetType(type.AssemblyQualifiedName);,但 type2 也是 null。 -
FusionLog显示找不到MyImpl.dll本身。但是GetType为什么要搜索呢,已经加载好了!
-
如果你已经有了你需要的类型的 Type 对象,为什么还要使用 GetType 按名称再次检索它?
-
@Lasse,因为该类型的程序集限定名称存储在配置文件中。下次程序运行时,我需要使用设置中的 AQN 获取 Type 对象。
标签: c# reflection interface gettype