Привет, у меня есть приложение, состоящее из некоторого «ядра» и модулей, которые динамически загружаются в собственный домен приложения и выгружаются по мере необходимости. Но я не понимаю одного. Я опубликую простой код, похожий на то, что у меня есть.
Существует «интерфейс» класса, который содержит множество виртуальных хуков и свойств, а также некоторые собственные функции:
[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, который должен содержать все существующие загруженные экземпляры, и вызываю соответствующий хук в этом. Это отлично работает, если я нахожусь в одном AppDomain. Но если я использую отдельный AppDomain для модуля, кажется, что память исходного домена копируется в новый домен, и когда я вызываю конструктор нового экземпляра, он не вставляет себя в статический массив в Module.module исходного домена, но он вставляет себя в Module.module в новом домене. Это означает, что в ядре у меня все еще 0 модулей в Module.module. Мне удалось исправить это, создав другую функцию, которая регистрирует модуль вместо той, что была у меня в конструкторе. Но все же бывает, что иногда я обращаюсь к памяти в исходном домене, а иногда к памяти в новом домене модуля. Это вызывает неприятности. Как я могу убедиться, что я всегда обращаюсь к одной и той же памяти из ядра и из модуля?
Пример того, что мне нужно сделать, это:
- Передать указатель на экземпляр класса, который находится в памяти AppDomain A, на хук модуля, находящегося в AppDomain B.
- пусть модуль что-то меняет в этом классе (в памяти домена А, а не в Б)
