2010-03-12 75 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代碼看起來就像是我的DynamicMethod的的IL代碼上方(除了我的測試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-doi-i-fix-它) – Nasreddine

回答

1

強迫猜測,我會冒險發佈靜態方法,但在C#代碼中使用實例方法。肯定有一個「這個」參數(arg.0),但它從未被使用過。聲明它是靜態的,再次編譯和反彙編。

+0

我確實用它作爲一個實例DynamicMethod的,但我不認爲我是發光爲靜態: 列表 parameterTypes =新名單 {typeof運算(DMBuilder)的typeof(IDynamicSerializationWriter)的typeof (object).MakeByRefType(),typeof(MyContract)};動態方法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中推送null。 您可以將其刪除。