从已加载的程序集

时间:2016-02-05 13:21:45

标签: c# .net reflection types .net-assembly

我有一个小插件架构,我使用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变得愚蠢,并在尝试加载程序集之前检查有问题类型的已加载程序集。

0 个答案:

没有答案