1

私はこの質問を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を返しています。なぜですか?

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 に答える