2010-03-12 3 views
0

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

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); 

И я определенно не проходит ни в чем нуль.

Заранее благодарен!

+0

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix- она) – Nasreddine

ответ

1

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

+0

я действительно использовать его в качестве DynamicMethod на экземпляре, но я не думаю, что я испуская как статические: Список parameterTypes = новый список {TypeOf (DMBuilder), TypeOf (IDynamicSerializationWriter), TypeOf (объект) .MakeByRefType(), typeof (MyContract)}; DynamicMethod dm = new DynamicMethod (string.Format («Write_ {0}», contract.TypeName), typeof (void), parameterTypes.ToArray(), typeof (DMBuilder), true); Это неправильное изображение? – Jeff

+0

@Jeff: это статический метод. Это объясняет вашу проблему, ваш код использует неправильные аргументы. –

+0

Извините, я думаю, я не совсем понимаю. Я должен был включить следующую строку: var d = dm.CreateDelegate (typeof (DynamicWrite), this) Затем я вызываю как: d (x, y); Что я должен делать по-другому? Благодарю. – Jeff

0
IL_0002 isinst 

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

Смежные вопросы