DynamicMethod NullReferenceException - PullRequest
       25

DynamicMethod NullReferenceException

0 голосов
/ 12 марта 2010

Может кто-нибудь сказать мне, что не так с моим кодом IL здесь?

IL_0000: nop        
IL_0001: ldarg.1    
IL_0002: isinst     MyXmlWriter
IL_0007: stloc.0    
IL_0008: ldloc.0    
IL_0009: ldarg.2    
IL_000a: ldind.ref  
IL_000b: unbox.any  TestEnum
IL_0010: ldfld      Int64 value__/FastSerializer.TestEnum
IL_0015: callvirt   Void WriteValue(Int64)/System.Xml.XmlWriter
IL_001a: nop        
IL_001b: ret       

Я схожу с ума здесь, так как я написал тестовое приложение, которое делает то же самое, что и выше, но в C # и в рефлекторе, код IL из этого выглядит так же, как код IL моего DynamicMethod выше (кроме моего теста Приложение C # использует TestStruct с открытым полем вместо поля частного значения в перечислении выше, но у меня для skipVisibility установлено значение true) ...

Я получаю исключение NullReferenceException.

Моя подпись DynamicMethod:

public delegate void DynamicWrite(IMyXmlWriter writer, ref object value, MyContract contract);

Я генерирую метод следующим образом:

List<Type> parameterTypes = new List<Type> { 
   typeof(DMBuilder), 
   typeof(IDynamicSerializationWriter), 
   typeof(object).MakeByRefType(), 
   typeof(MyContract) 
}; 
DynamicMethod dm = new DynamicMethod(string.Format(
  "Write_{0}", 
  contract.TypeName), 
  typeof(void), 
  parameterTypes.ToArray(), 
  typeof(DMBuilder), 
  true
);

var d = dm.CreateDelegate(typeof(DynamicWrite), this);
d(x,y); 

И я определенно не пропускаю ничего ноль.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Вынужденный сделать предположение, я бы рискнул, если бы вы использовали статический метод, но использовали метод экземпляра в вашем коде C #. Определенно есть аргумент "this" (arg.0), но он никогда не используется. Объявите его статическим, скомпилируйте и снова разберите.

0 голосов
/ 08 января 2015
IL_0002 isinst 

эта инструкция возвращает ноль в local.0. Вы можете удалить его.

...