【问题标题】:"AccessViolationException was unhandled" error in C# Managed CodeC# 托管代码中的“AccessViolationException 未处理”错误
【发布时间】:2012-04-03 16:49:05
【问题描述】:

我有新问题。我的代码:

.method public static void  Main() cil managed
{
  .entrypoint
  // Code size       3 (0x3)
  .maxstack  1
  IL_0000:  ldnull
  IL_0001:  stloc.0
  IL_0002:  ret
} // end of method Program::Main

C#代码:

il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ret);

我正在通过 System.Reflection 和 System.Reflection.Emit 类生成此代码。有人知道为什么这行不通吗?请帮忙。

一个小问题——我应该生成构造函数吗?

【问题讨论】:

  • 只需使用 il.DeclareLocal(...);
  • Protip:编写IL时,总是在汇编后使用PEVerify。它会立即告诉你这个错误。

标签: c# exception .net-assembly reflection.emit il


【解决方案1】:

您尝试在本地 0 (stloc.0) 中存储 null,但实际上没有定义任何本地。

您需要使用DeclareLocal 方法来定义本地,然后您可以将其传递给接受LocalBuilder 的Emit 重载(例如,您可以使用它来发出stloc 操作码,然后是您的本地构建器);或者你可以继续使用stloc.0,因为你知道只有一个本地人。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多