通过反射在 C# 中查找模块初始化器

问题描述 投票:0回答:1

有没有办法通过反射在 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);

请注意,我尝试使用这些标志查找模块中的所有方法,因为如果您使用 ildasm 检查 MI,则名称似乎会被混淆。不幸的是它不返回任何方法。

使用 Visual Studio 中的调试器,您可以看到它在模块中被声明为成员,但它在模块中被声明为方法,这可能就是 GetMethods 没有返回它的原因。

如何找到它?

c# reflection clr-module-initializer
1个回答
0
投票

模块成员由称为

<Module>
的技术类型表示,该类型不会在
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>
实际上只是一种用于管理目的的技术类型。

© www.soinside.com 2019 - 2024. All rights reserved.