--- original/DynamicMethodILProvider.cs 2010-02-09 14:24:32.000000000 +0100 +++ patched/DynamicMethodILProvider.cs 2013-02-03 02:35:24.000000000 +0100 @@ -6,6 +6,7 @@ namespace ClrTest.Reflection { public class DynamicMethodILProvider : IILProvider { + static FieldInfo s_code = typeof(DynamicILInfo).GetField("m_code", BindingFlags.NonPublic | BindingFlags.Instance); static FieldInfo s_fiLen = typeof(ILGenerator).GetField("m_length", BindingFlags.NonPublic | BindingFlags.Instance); static FieldInfo s_fiStream = typeof(ILGenerator).GetField("m_ILStream", BindingFlags.NonPublic | BindingFlags.Instance); static MethodInfo s_miBakeByteArray = typeof(ILGenerator).GetMethod("BakeByteArray", BindingFlags.NonPublic | BindingFlags.Instance); @@ -19,14 +20,24 @@ public byte[] GetByteArray() { if (m_byteArray == null) { - ILGenerator ilgen = m_method.GetILGenerator(); - try { - m_byteArray = (byte[])s_miBakeByteArray.Invoke(ilgen, null); - if (m_byteArray == null) m_byteArray = new byte[0]; - } catch (TargetInvocationException) { - int length = (int)s_fiLen.GetValue(ilgen); - m_byteArray = new byte[length]; - Array.Copy((byte[])s_fiStream.GetValue(ilgen), m_byteArray, length); + if (m_method.GetDynamicILInfo() != null) + { + m_byteArray = (byte[])s_code.GetValue(m_method.GetDynamicILInfo()); + } + if (m_byteArray.Length == 0) + { + ILGenerator ilgen = m_method.GetILGenerator(); + try + { + m_byteArray = (byte[])s_miBakeByteArray.Invoke(ilgen, null); + if (m_byteArray == null) m_byteArray = new byte[0]; + } + catch (TargetInvocationException) + { + int length = (int)s_fiLen.GetValue(ilgen); + m_byteArray = new byte[length]; + Array.Copy((byte[])s_fiStream.GetValue(ilgen), m_byteArray, length); + } } } return m_byteArray;