1

我在 SO 上看到了相当多的这个问题,我已经遵循了这个建议,但我似乎做错了什么。dll 似乎可以正常加载,但 CreateInstance 返回的对象为空。

我有这个dll:

namespace Backfill
{
public class Module : Kernel.Module
{
    public override void ModuleStart()
    {
        //Stuff
    }
}
}

在另一个具有不同命名空间的 DLL 中

namespace Kernel
{

public abstract class Module
{
    public abstract void ModuleStart();
}



public static void KernelStart()
    {
        string load_dll = @"Path to DLL";

        Assembly test_dll = Assembly.LoadFile(load_dll + ".dll");

        Module test_mod = (Module)test_dll.CreateInstance("Kernel.Module");

        test_mod.ModuleStart();
    }
}

(Module)test_dll.CreateInstance("Kernel.Module");但是,返回 null。知道为什么吗?

4

2 回答 2

4
(Module)test_dll.CreateInstance("Kernel.Module")

这行不通。正如您所指定的,Module您尝试实例化的类(我假设是第一个 DLL 中的类)不在Kernel命名空间中,而是在Backfill命名空间中。因此,您应该有以下几点:

(Module)test_dll.CreateInstance("Backfill.Module")
于 2013-02-14T21:03:14.293 回答
2

Kernel.Module 是一个抽象类。您不能直接创建它的实例。您需要创建派生类的实例。

编辑:由于提供更多信息:

@Antonijn 有同样的答案。您需要直接指定您想要的类型。BackFill.Module 似乎是正确的。

编辑前:

如果您在多个程序集中具有相同的名称,那么您需要为您想要的类型使用完全限定的(包括程序集名称)。例如:https ://stackoverflow.com/a/2300428/30225作为可能的答案。

于 2013-02-14T20:53:31.270 回答