Поиск инициализатора модуля в C# с помощью Reflection

Есть ли способ найти инициализатор модуля в C# с помощью отражения? Я загружаю сборку с совершенно неизвестными типами, но в сборке обязательно будет инициализатор модуля, но, похоже, нет способа найти его с помощью отражения. Чтобы загруженная сборка работала правильно, она ДОЛЖНА запускать свой MI. Вот что я сейчас пытаюсь:

var asm = Assembly.LoadFrom("GameBase.dll");
var module = asm.Modules.First(); //There's only one module.
//All MI cctor's must be private and static.
var cctor = module.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);

Обратите внимание, что я пытаюсь найти все методы в модуле с этими флагами, потому что, если вы проверяете MI с помощью ildasm, кажется, что имя запутывается. К сожалению, он не возвращает никаких методов.

Используя отладчик в Visual Studio, вы можете видеть, что он объявлен как член в модуле, но он объявлен как метод в модуле, поэтому, вероятно, он не получает возврат от GetMethods.

Как я могу найти это?

1 ответ

Члены модуля представлены техническим типом, который не возвращаетсяModule.GetTypes()но доступ к нему возможен из внутреннегоModule.RuntimeTypeсвойство. Инициализатор модуля можно получить как статический конструктор этого типа.

      var moduleType = (Type)myModule.GetType()
    .GetProperty("RuntimeType", BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(myModule, null);
var cctor = moduleType.GetConstructor(BindingFlags.Static | BindingFlags.NonPublic, Type.EmptyTypes);

Обратите внимание, чтоcctor.DeclaringTypeявляетсяnull. Это справедливо и для других членов модуля (глобальные методы/свойства), поэтому<Module>на самом деле это всего лишь технический тип для административных целей.

Другие вопросы по тегам