我发现了在我正在生产的 DynamicMethod 中得到“操作可能破坏运行时的稳定性”的原因,虽然我很容易修复它,但它给我留下了一个看似简单的问题:
- 如何将“Object”类型的对象引用转换为特定类型,以便我可以在对象引用上调用该类型的方法?
下面是一个示例程序。运行它时,它会在编译方法时崩溃并出现“操作可能破坏运行时”异常。
只需将声明为 typeTestClass
而不是的变量的类型更改即可解决此问题Object
,但我仍然想知道如何将引用转换为代码中的适当类型。
在代码中,我用星号标记了一行。那时我可以发出什么代码,将Object
堆栈上的TestClass
引用变为引用,以便方法调用将通过?
请注意,我知道这是产生问题的方法调用,如果我完全注释掉这些行,那么变量的类型无关紧要,该方法被编译并执行得很好。
这是代码。
using System;
using System.Reflection.Emit;
namespace ConsoleApplication9
{
public class TestClass
{
public void TestMethod() { }
}
class Program
{
static void Main(string[] args)
{
Type type = typeof(TestClass);
DynamicMethod method = new DynamicMethod("", typeof(Object), null);
ILGenerator il = method.GetILGenerator();
LocalBuilder variable = il.DeclareLocal(typeof(Object));
// Construct object
il.Emit(OpCodes.Newobj, type.GetConstructor(new Type[0]));
il.Emit(OpCodes.Stloc, variable);
// Call Test method
il.Emit(OpCodes.Ldloc, variable);
// ***************************************** what do I do here?
il.Emit(OpCodes.Call, type.GetMethod("TestMethod"));
// Return object
il.Emit(OpCodes.Ldloc, variable);
il.Emit(OpCodes.Ret);
// Create and call delegate
Func<Object> fn = (Func<Object>)method.CreateDelegate(
typeof(Func<Object>));
Object instance = fn();
}
}
}