我有一个小插件架构,我使用MEF从自定义目录加载插件。对于某些要求,我需要从一个包含在其中一个插件程序集中的类创建一个Type
的实例。我正在尝试使用Type.GetType()
和类型的完全限定名称(程序集+名称空间+类型)来执行此操作。
这会失败,因为.NET会以某种方式尝试从程序集中加载类型(显然)不包含在可执行文件的默认探测路径中。如果类型尚未出现,这种行为会很好,但是因为我已经加载了整个程序集(请记住,插件框架),所以有问题的程序集已经加载到当前的应用程序域中!当我在插件中创建Type
类的实例并通过某个合同返回它时,我可以毫无问题地使用它。
如何告诉.NET运行时它不应该从程序集中加载类型,而是检查程序集是否尚未在当前应用程序域中加载?
// --- MyProject.Contract
public interface IPlugin {
string GetTypeName();
Type GetType();
}
// --- MyProject.Plugin
public class SomeType { }
public class MyPlugin : IPlugin {
public string GetTypeName() {
return typeof(SomeType).AssemblyQualifiedName;
}
public string GetType() {
return typeof(SomeType);
}
}
// --- MyProject.App
var assembly = Assembly.LoadFrom("path/to/pluginfolder/MyPlugin.dll");
var pluginType = assembly.GetExportedTypes().OfType<IPlugin>().FirstOrDefault();
var plugin = (IPlugin) Activator.CreateInstance(pluginType)
Console.WriteLine(plugin.GetType().Name); // works
// fails because .NET tries to load the assembly AGAIN and doesn't find it
// in the default probing paths
Console.WriteLine(Type.GetType(plugin.GetTypeName()));
哦,顺便说一下:我不是在寻找像手动解析组件或添加其他探测路径。我想阻止.NET变得愚蠢,并在尝试加载程序集之前检查有问题类型的已加载程序集。