6

我正在尝试动态加载一些 .dll 文件。文件是插件(目前是自己编写的),它们至少有一个实现MyInterface. 对于每个文件,我正在执行以下操作:

    Dictionary<MyInterface, bool> _myList;

    // ...code

    Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
    foreach (Type type in assembly.GetTypes())
    {
        var myI = type.GetInterface("MyInterface");
        if(myI != null)
        {
            if ((myI.Name == "MyInterface") && !type.IsAbstract)
            {
                var p = Activator.CreateInstance(type);
                _myList.Add((MyInterface)p, true);
            }
        }
    }

运行此程序会导致强制转换异常,但我找不到解决方法。无论如何,我想知道为什么这根本不起作用。我正在寻找 .NET Framework 3.5 中的解决方案。

发生在我身上的另一件事是null在上面的代码中p添加新条目之前运行以下命令后进入:_myList

var p = type.InvokeMember(null, BindingFlags.CreateInstance, null,
                          null, null) as MyInterface;

p这段代码是第一次尝试加载插件,我还没有找到原因null。我希望有人能引导我走向正确的道路:)

4

3 回答 3

5

有更简单的方法可以检查您的类型是否可以转换为您的界面。

Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
foreach (Type type in assembly.GetTypes())
{
    if(!typeof(MyInterface).IsAssignableFrom(type))
        continue;

    var p = Activator.CreateInstance(type);
    _myList.Add((MyInterface)p, true);
}

如果IsAssignableFrom为假,则您的继承有问题,这很可能是您的错误的原因。

于 2012-08-08T16:11:30.450 回答
4

您应该真正阅读Jon Skeet 的Plug-ins and cast exceptions,它解释了您看到的行为以及如何正确地执行插件框架。

于 2012-08-08T16:18:06.077 回答
1

请查看以下代码。我认为Type.IsAssignableFrom(Type type)在这种情况下可以帮助你。

Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
///Get all the types defined in selected  file
Type[] types = assembly.GetTypes();

///check if we have a compatible type defined in chosen  file?
Type compatibleType = types.SingleOrDefault(x => typeof(MyInterface).IsAssignableFrom(x));

if (compatibleType != null)
{
    ///if the compatible type exists then we can proceed and create an instance of a platform
    found = true;
    //create an instance here
    MyInterface obj = (ALPlatform)AreateInstance(compatibleType);

}
于 2012-08-08T16:12:23.243 回答