C# InvalidProgrameException:(包装器动态方法)对象中的IL代码无效:GetField():IL_0000:ret

C# InvalidProgrameException:(包装器动态方法)对象中的IL代码无效:GetField():IL_0000:ret,c#,cil,C#,Cil,如标题所述。然而,我正试图做到这一点: delegate char[] FieldDelegate(); private FieldDelegate Get_InternalBuffer(StringBuilder sb) { var sbType = sb.GetType(); var fieldInfo = sbType.GetField("m_ChunkChars", BindingFlags.GetField

如标题所述。然而,我正试图做到这一点:

  delegate char[] FieldDelegate();
   
  private FieldDelegate Get_InternalBuffer(StringBuilder sb)
  {
     var sbType = sb.GetType();
     var fieldInfo = sbType.GetField("m_ChunkChars", 
        BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
     
     var dynMethod = new DynamicMethod("GetField", typeof(char[]), new Type[0], true);
     ILGenerator ig = dynMethod.GetILGenerator();
     ig.Emit(OpCodes.ldflda, fieldInfo);
     ig.Emit(OpCodes.Ret);
     return dynMethod.CreateDelegate(typeof(FieldDelegate)) as FieldDelegate;
  }
简而言之,我不知道为什么。我已经检查了一个只包含“char[]buffer”的类的IL代码,以模拟我在这里所做的事情,它实际上正确地指出:“IL_0006:ret”作为单个IL_指令,那么我做错了什么

任何帮助都会很棒


致以最诚挚的问候

我不能100%确定您想要实现的是什么,但它必须是动态的/使用Emit API吗

如果不是,这里有一个有效的反射方法:

private static Func<char[]> Get_InternalBuffer_Reflection_Only(StringBuilder stringBuilder)
{
   Type sbType = stringBuilder.GetType();
   FieldInfo fieldInfo = sbType.GetField("m_ChunkChars",
   BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

   Func<char[]> func = () => (char[])fieldInfo.GetValue(stringBuilder);
   return func;
}
您必须使用
StringBuilder
调用返回的方法。
这也意味着您现在可以缓存返回的方法并重用它。

我不能100%确定您试图实现的是什么,但它必须是动态的/使用Emit API吗

如果不是,这里有一个有效的反射方法:

private static Func<char[]> Get_InternalBuffer_Reflection_Only(StringBuilder stringBuilder)
{
   Type sbType = stringBuilder.GetType();
   FieldInfo fieldInfo = sbType.GetField("m_ChunkChars",
   BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

   Func<char[]> func = () => (char[])fieldInfo.GetValue(stringBuilder);
   return func;
}
您必须使用
StringBuilder
调用返回的方法。
这也意味着您现在可以缓存返回的方法并重用它。

这就像您向自己提出了一个问题。我的意思是这里确实缺乏信息。这个问题需要更清楚你还需要什么?编辑代表以显示我试图创建的是哪一个,sry我没有看到这像是你问了自己一个问题。我的意思是这里确实缺乏信息。这个问题需要更清楚你还需要什么?编辑代理以显示我尝试创建的代理,sry我没有看到是的,我希望EmitApi用于性能以避免反射代码,因为我必须在循环中使用这种方法!这里一个纯粹的反射代码将永远破坏性能。太好了,非常感谢!我只是无法正确理解为什么需要将这个Stringbuilder实例传递给dynamic方法,为什么我的方法不起作用,因为我也在说。“sbBuffer.GetType()”这实际上应该在我的脑海中至少作为您的解决方案工作?显然不是:D thx alot tho!是的,我希望EmitApi的性能能够避免反射代码,因为我必须在循环中使用这种方法!这里一个纯粹的反射代码将永远破坏性能。太好了,非常感谢!我只是无法正确理解为什么需要将这个Stringbuilder实例传递给dynamic方法,为什么我的方法不起作用,因为我也在说。“sbBuffer.GetType()”这实际上应该在我的脑海中至少作为您的解决方案工作?显然不是:D thx alot tho!