如何从加载的dll中获取对象

本文关键字:获取 取对象 dll 加载 | 更新日期: 2023-09-27 17:59:29

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

我有这个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。知道为什么吗?

如何从加载的dll中获取对象

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

这行不通。正如您所指定的,您试图实例化的Module类(我认为它是来自第一个DLL的类)不在Kernel命名空间中,而是在Backfill命名空间中。因此,你应该有这样的东西:

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

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

@安东尼也有同样的答案。您需要直接指定所需的类型。BackFill.Module似乎是正确的。

编辑前:

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