こんにちは、いくつかの「カーネル」と、独自の AppDomain に動的にロードされ、必要に応じてアンロードされるモジュールで構成されるアプリケーションがあります。しかし、私は一つのことを理解していません。私が持っているものに似た簡単なコードを投稿します。
多くの仮想フックとプロパティ、およびいくつかの独自の関数を含む「インターフェイス」クラスがあります。
[Serializable()]
public abstract class Module : MarshalByRefObject
{
public static List<Module> module = new List<Module>();
public string Name = "";
public string Version = "unknown";
public DateTime Date = DateTime.Now;
Module()
{
lock(module)
{
module.Add(this);
}
}
~Module()
{
Exit();
lock (module)
{
if (module.Contains(this))
{
module.Remove(this);
}
}
core.Log("Module was unloaded: " + this.Name);
}
public virtual void Hook1()
{
// by default ignore
}
}
各モジュールは、コアを参照する新しいプロジェクトであり、モジュールから継承されて「カーネル」を拡張する新しいクラスを作成します。一部のイベントは、既存のロードされたすべてのインスタンスを含むことになっている Module.module List をループして、その中でそれぞれのフックを呼び出す方法でフックされます。1 つの AppDomain にいる場合、これは正常に機能します。しかし、モジュールに別の AppDomain を使用すると、元のドメインのメモリが新しいドメインにコピーされるようで、新しいインスタンスのコンストラクターを呼び出すと、元のドメインの Module.module の静的配列に挿入されませんが、それ自体を新しいドメインの Module.module に挿入します。つまり、コアでは、Module.module にまだ 0 個のモジュールがあります。コンストラクターにあったものではなく、モジュールを登録する別の関数を作成することで、これを修正できました。それでも、モジュールの元のドメインのメモリにアクセスしたり、新しいドメインのメモリにアクセスしたりすることがあります。これにより、トラブルが発生します。カーネルからもモジュールからも常に同じメモリにアクセスできるようにするにはどうすればよいですか?
私がする必要があることの例は次のとおりです。
- AppDomain A のメモリにあるクラスのインスタンスへのポインタを、AppDomain B にあるモジュールのフックに渡します。
- モジュールにそのクラスの何かを変更させます (ドメイン B ではなく、ドメイン A のメモリ内)。