0

ここで私の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#で書いたので、ここで夢中になります.上記の列挙型のプライベート値フィールドの代わりにパブリック フィールドを持つ 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); 

そして、私は絶対にnullを渡していません。

前もって感謝します!

4

2 に答える 2

1

推測することを余儀なくされましたが、静的メソッドを発行しているのに、C# コードでインスタンス メソッドを使用していることに賭けます。「this」引数 (arg.0) は間違いなくありますが、使用されることはありません。静的に宣言し、コンパイルして再度逆アセンブルします。

于 2010-03-12T17:53:52.957 に答える
0
IL_0002 isinst 

この命令は local.0 にヌルをプッシュします。削除できます。

于 2015-01-07T21:14:40.850 に答える