C# Assembly.CreateInstance类型转换返回null

C# Assembly.CreateInstance类型转换返回null,c#,.net-assembly,C#,.net Assembly,我正在尝试在运行时加载并使用DLL,这很好: var pluggin = asm2.CreateInstance("ParserTest.Interface", true) as iPluggin; 但事实并非如此(我需要遍历特定文件夹中的DLL文件,以找到实现iPluggin接口的正确文件): 在调试模式下进行一些研究后,我发现: asm.CreateInstance(tName, true) 返回正确的对象,但尝试将其强制转换为iPluggin时,结果为null。 知道为什么吗?我做了类

我正在尝试在运行时加载并使用DLL,这很好:

var pluggin = asm2.CreateInstance("ParserTest.Interface", true) as iPluggin;
但事实并非如此(我需要遍历特定文件夹中的DLL文件,以找到实现iPluggin接口的正确文件):

在调试模式下进行一些研究后,我发现:

asm.CreateInstance(tName, true)
返回正确的对象,但尝试将其强制转换为iPluggin时,结果为null。
知道为什么吗?

我做了类似的事情:

private readonly Type _pluginbaseType = typeof(BasePlugin);

public AssemblyPlugin(Assembly assembly)
{

    Type[] _plugins = _assembly.GetExportedTypes()
        .Where(t => t.BaseType.IsSubclassOf(_pluginbaseType)
        .ToArray();
}
在此之后,您可以:

BasePlugin plugin = (BasePlugin)Activator.CreateInstance(pluginType);

您应该更喜欢基类而不是接口。

尽管我不懂,但还是解决了问题

定义de接口(SDK.DLL)的DLL是正在检查的DLL之一。 我在我的查询和所有工作中手动删除了它。 这是我的最终代码:

    var plugins =
        from fi in di.GetFiles("*.dll").Where(p => p.Name.ToUpper() != "SDK.DLL")
        let asm = Assembly.LoadFrom(fi.FullName)
        from t in asm.GetExportedTypes()
        where t.GetInterface(typeof(iPluggin).Name) != null
        select asm.CreateInstance(t.FullName, true) as iPluggin;
    Project.ProcessList.AddRange(plugins);

因为它返回一个不兼容类型的对象(?).CreateInstance按预期返回一个System.object,所以我所看到的工作代码和不工作代码之间的唯一区别是我手动提供了接口名称(“ParserTest.interface”)在第一种情况下,
as
返回null,而不是在转换失败时引发异常,这是由于Ondrej所说的。是的,但是如果它没有实现该接口,“as”返回null。那么:接口声明在哪里?@FranCasadome那么看起来您不知何故加载了声明
iPluggin
两次的程序集。你试过重新编译所有的东西吗?你不是从一个陌生的地方或者类似的地方加载那个程序集吗?为什么基类比接口好?好吧,我发现了一件事:如果所有检查接口的DLL都实现了它,那么它就可以正常工作。一旦其中一个没有执行,其余的则返回null,无论是否执行:/@svick:基类可以具有基本功能,而接口不能。在这种情况下,您可能更愿意提供所有插件的特定行为。选择抽象基类的主要原因是版本控制,因为您总是可以在不破坏现有客户机的情况下向抽象基类添加新的虚拟成员。这在接口上是不可能的。这里:。您可以使用
Type.IsAssignableFrom
方法,而不是专门检查接口类型,因为接口类型将涵盖基类和接口。由于您有类型引用本身,请使用
Activator.CreateInstance(t)
,而不是让它按类型名称在程序集中进行另一次查找(特别是因为您进行了不区分大小写的搜索。理论上,可能存在名称相同但区分大小写不同的类型!)您可能还希望检查该类型是否具有无参数构造函数,或者捕获(并报告)如果提供的
iPlugin
实现未实现无参数构造函数,则会触发的
MissingMethodException
    var plugins =
        from fi in di.GetFiles("*.dll").Where(p => p.Name.ToUpper() != "SDK.DLL")
        let asm = Assembly.LoadFrom(fi.FullName)
        from t in asm.GetExportedTypes()
        where t.GetInterface(typeof(iPluggin).Name) != null
        select asm.CreateInstance(t.FullName, true) as iPluggin;
    Project.ProcessList.AddRange(plugins);