我在SO上看到这个问题相当多,而且我遵循了这个建议,但我似乎做错了什么。 dll似乎加载正常,但返回的对象CreateInstance为null。
我有这个dll:
namespace Backfill
{
public class Module : Kernel.Module
{
public override void ModuleStart()
{
//Stuff
}
}
}
在另一个具有DIFFERENT命名空间的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。知道为什么吗?
答案 0 :(得分:4)
(Module)test_dll.CreateInstance("Kernel.Module")
这不起作用。正如您指定的那样,您尝试实例化的Module
类(我假设是第一个DLL中的那个)不在Kernel
命名空间中,而是在{{1命名空间。因此,您应该遵循这些方针:
Backfill
答案 1 :(得分:2)
Kernel.Module是一个抽象类。您无法直接创建它的实例。您需要创建派生类的实例。
编辑:提供更多信息:
@Antonijn有相同的答案。您需要直接指定所需的类型。 BackFill.Module看起来是正确的。编辑前:
如果在多个程序集中具有相同的名称,则需要使用所需类型的完全限定(包括程序集名称)。例如:https://stackoverflow.com/a/2300428/30225作为可能的答案。