可以调用 OpCodes.Jmp 将控制转移到驻留在不同程序集中的方法吗?
Can OpCodes.Jmp be called to transfer control to a method that resides on a different assembly?
驻留在 AssemblyA 中的 Method1 可以向驻留在 AssemblyB 中的 Method1 发出 OpCodes.Jmp 吗?两种方法具有完全相同的签名。
我似乎无法完成这项工作,总是收到 System.InvalidProgramException:公共语言运行时检测到一个无效程序。
如果重定向在同一个程序集内,则有效。
如果可能,请提供使用 Reflection.Emit 的示例。
你肯定漏掉了什么。两种方法都是静态的吗?他们有相同的调用约定吗?
以下代码无法重现您的问题:
static void Main(string[] args)
{
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly
(new AssemblyName("TestAssembly"), AssemblyBuilderAccess.Run);
var module = assembly.DefineDynamicModule("Main");
var type = module.DefineType("Test");
var method = type.DefineMethod
(
"Test", MethodAttributes.Public | MethodAttributes.Static,
typeof(int), new[] { typeof(string) }
);
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Jmp, typeof(Class1).GetMethod("Test"));
var obj = Activator.CreateInstance(type.CreateType());
var func = (Func<string, int>)
obj.GetType().GetMethod("Test").CreateDelegate(typeof(Func<string, int>));
var result = func("Banana");
Console.WriteLine(result);
Console.ReadLine();
}
而在另一个程序集中,Test
class:
public static class Class1
{
public static int Test(string hi)
{
return 42;
}
}
您确定自己没有违反任何限制吗?
- 执行此指令时,计算堆栈必须为空。
- 目标地址的调用约定、参数数量和类型必须与当前方法匹配。
- jmp 指令不能用于从 try、filter、catch 或 finally 块中转移控制。
驻留在 AssemblyA 中的 Method1 可以向驻留在 AssemblyB 中的 Method1 发出 OpCodes.Jmp 吗?两种方法具有完全相同的签名。
我似乎无法完成这项工作,总是收到 System.InvalidProgramException:公共语言运行时检测到一个无效程序。
如果重定向在同一个程序集内,则有效。
如果可能,请提供使用 Reflection.Emit 的示例。
你肯定漏掉了什么。两种方法都是静态的吗?他们有相同的调用约定吗?
以下代码无法重现您的问题:
static void Main(string[] args)
{
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly
(new AssemblyName("TestAssembly"), AssemblyBuilderAccess.Run);
var module = assembly.DefineDynamicModule("Main");
var type = module.DefineType("Test");
var method = type.DefineMethod
(
"Test", MethodAttributes.Public | MethodAttributes.Static,
typeof(int), new[] { typeof(string) }
);
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Jmp, typeof(Class1).GetMethod("Test"));
var obj = Activator.CreateInstance(type.CreateType());
var func = (Func<string, int>)
obj.GetType().GetMethod("Test").CreateDelegate(typeof(Func<string, int>));
var result = func("Banana");
Console.WriteLine(result);
Console.ReadLine();
}
而在另一个程序集中,Test
class:
public static class Class1
{
public static int Test(string hi)
{
return 42;
}
}
您确定自己没有违反任何限制吗?
- 执行此指令时,计算堆栈必须为空。
- 目标地址的调用约定、参数数量和类型必须与当前方法匹配。
- jmp 指令不能用于从 try、filter、catch 或 finally 块中转移控制。