- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有这个方法:
MethodBuilder doubleMethod = typeBuilder.DefineMethod("Double",
MethodAttributes.Public | MethodAttributes.Static,
typeof(int), new [] { typeof(int) });
ILGenerator il = countMethod.GetILGenerator();
il.Emit(OpCodes.Ldarg_0); // We load the input argument (an int) into the evaluation stack
il.Emit(OpCodes.Ldc_I4_2); // We load the integer 2 into the evaluation stack
il.Emit(OpCodes.Mul); // We multiply both numbers (n * 2)
il.Emit(OpCodes.Ret); // We return what is left on the evaluation stack, i.e. the result of the multiplication
我可以成功调用这个方法:
Type type = typeBuilder.CreateType();
MethodInfo method = type.GetMethod("Double");
object result = method.Invoke(null, new object[] { 4 }); // result = 8
但是,如果我将我的 IL 代码更改为:
il.Emit(OpCodes.Ldarg_0); // We load the input argument (an int) into the evaluation stack
il.Emit(OpCodes.Ldc_I4_2); // We load the integer 2 into the evaluation stack
il.Emit(OpCodes.Mul); // We multiply both numbers (n * 2)
/* I added these two instructions */
il.Emit(OpCodes.Stloc_0); // We pop the value from the evaluation stack and store into a local variable
il.Emit(OpCodes.Ldloc_0); // We read that local variable and push it back into the evaluation stack
il.Emit(OpCodes.Ret); // We return what is left on the evaluation stack, i.e. the result of the multiplication
尝试调用生成的方法时,抛出以下异常:
TargetInvocationException was unhandled - Exception has been thrown by the target of an invocation.
这是为什么?我的意思是,从评估堆栈中弹出值然后再次压入相同的值应该绝对没有任何作用。当它到达 OpCodes.Ret
时,正确的值应该在计算堆栈上。
最佳答案
要在 IL 中使用局部变量,您首先需要声明它,以便运行时知道它的类型。为此,请使用 ILGenerator.DeclareLocal()
.
您也可以考虑 using the LocalBuilder
returned from DeclareLocal()
在发出使用该变量的指令时。这样,您就不需要记住所有局部变量的索引:
var local = il.DeclareLocal(typeof(int));
…
il.Emit(OpCodes.Stloc, local);
il.Emit(OpCodes.Ldloc, local);
关于c# - 为什么存储局部变量并读回它会触发 TargetInvocationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504267/
更新 2:似乎这个库根本不支持 Compact-Framework,而且我不断收到其他异常 - 我将按原样离开这个问题,但我认为你不应该浪费时间回答它。 我 opened another questi
假设我有这个方法: MethodBuilder doubleMethod = typeBuilder.DefineMethod("Double",
我正在使用 Visual Studio 2008(C# Express Edition),我正在尝试调试由于我触发的事件而发生的 TargetInvocationException。 我的问题不是专门
我有一个名为carroms 的类(class)。当我创建它的对象时,没有错误。但是当我创建一个 carroms 数组时,抛出了这个异常: An unhandled exception of type
这个问题在这里已经有了答案: How to rethrow InnerException without losing stack trace in C#? (11 个答案) 关闭 8 年前。 我正
这个问题不太可能帮助任何 future 的访客;它只与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
由于 UI 线程(进度条)上的 Windows 控件,我在另一个线程中执行长时间处理时遇到了 TargetInvocationException。此异常导致我的应用程序崩溃(在调试中转到 main 方
我构建了一个显示图像的 WPF 控件。现在我想以非常快的速度更改该图像。我构建了一个 ImageContainer 类,它保存图像并有一个 ChangedEventHandler,它在更改时更新我控件
我收到这个未处理的异常错误: An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred
我想编写一个测试来检查我的抽象类构造函数是否正确处理了无效参数。我写了一个测试: [TestMethod] [ExpectedException(typeof(ArgumentException))]
我的调试器有问题,当在 UI 线程中执行错误代码时,调试器会正确指出错误行,这在线程内执行时也是如此,但在调度程序内调用时它的行为有点奇怪: TargetInvocationException 在反汇
我真的不知道发生了什么,为什么会一直发生 调用目标抛出异常。 代码在 frm5 中运行 然后错误显示在 程序.cs: using System; using System.Collections.Ge
我有许多使用 Delegate.DynamicInvoke 调用的方法。其中一些方法进行数据库调用,我希望能够捕获 SqlException 而不是捕获 TargetInvocationExcepti
我在使用反射实例化 DLL 文件中定义的类时遇到了一些问题。尽管代码看起来不错,但我在 Activator.CreateInstance 上得到了 TargetInvocationException。
解决方案后添加的注释:在反射调用的方法中抛出了 AccessViolationException。这就是无法捕获 TargetInvocationException 的原因。 注意:这是在 IDE 之
假设有以下情况。表单有一个按钮,单击该按钮可启动后台工作程序。在 RunWorkerCompleted 事件处理程序中,有一段代码会抛出未经处理的异常。表单从 Application.Run 方法启动
我正在为 Unity 游戏制作库存系统。 它按预期将库存序列化并保存到 xml 文件;但是,当我反序列化时,项目被设置为 null 并抛出 TargetInvocationException;最终是一
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我正在开发 WPF 应用程序,但我仅在运行时在单个设备上收到此错误。 Exception Info: System.Reflection.TargetInvocationException 我的问题:
此异常是什么意思,我该如何解决? 最佳答案 来自 MSDN: The exception that is thrown by methods invoked through reflection. T
我是一名优秀的程序员,十分优秀!