本文整理汇总了C#中System.Reflection.Emit.ILGenerator.ThrowException方法的典型用法代码示例。如果您正苦于以下问题:C# ILGenerator.ThrowException方法的具体用法?C# ILGenerator.ThrowException怎么用?C# ILGenerator.ThrowException使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Reflection.Emit.ILGenerator
的用法示例。
在下文中一共展示了ILGenerator.ThrowException方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GenerateDeserializerSwitch
static void GenerateDeserializerSwitch(CodeGenContext ctx, ILGenerator il, IDictionary<Type, TypeData> map)
{
// arg0: stream, arg1: out object
D(il, "deser switch");
var idLocal = il.DeclareLocal(typeof(ushort));
// read typeID
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldloca_S, idLocal);
il.EmitCall(OpCodes.Call, ctx.GetReaderMethodInfo(typeof(ushort)), null);
// +1 for 0 (null)
var jumpTable = new Label[map.Count + 1];
jumpTable[0] = il.DefineLabel();
foreach (var kvp in map)
jumpTable[kvp.Value.TypeID] = il.DefineLabel();
il.Emit(OpCodes.Ldloc_S, idLocal);
il.Emit(OpCodes.Switch, jumpTable);
D(il, "eihx");
il.ThrowException(typeof(Exception));
/* null case */
il.MarkLabel(jumpTable[0]);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Stind_Ref);
il.Emit(OpCodes.Ret);
/* cases for types */
foreach (var kvp in map)
{
var type = kvp.Key;
var data = kvp.Value;
il.MarkLabel(jumpTable[data.TypeID]);
var local = il.DeclareLocal(type);
// call deserializer for this typeID
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldloca_S, local);
if (data.WriterMethodInfo.IsGenericMethodDefinition)
{
Debug.Assert(type.IsGenericType);
var genArgs = type.GetGenericArguments();
il.EmitCall(OpCodes.Call, data.ReaderMethodInfo.MakeGenericMethod(genArgs), null);
}
else
{
il.EmitCall(OpCodes.Call, data.ReaderMethodInfo, null);
}
// write result object to out object
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldloc_S, local);
if (type.IsValueType)
il.Emit(OpCodes.Box, type);
il.Emit(OpCodes.Stind_Ref);
D(il, "deser switch done");
il.Emit(OpCodes.Ret);
}
}
示例2: GenerateSerializerSwitch
static void GenerateSerializerSwitch(CodeGenContext ctx, ILGenerator il, IDictionary<Type, TypeData> map)
{
// arg0: Stream, arg1: object
var idLocal = il.DeclareLocal(typeof(ushort));
// get TypeID from object's Type
var getTypeIDMethod = typeof(Serializer).GetMethod("GetTypeID", BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { typeof(object) }, null);
il.Emit(OpCodes.Ldarg_1);
il.EmitCall(OpCodes.Call, getTypeIDMethod, null);
il.Emit(OpCodes.Stloc_S, idLocal);
// write typeID
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldloc_S, idLocal);
il.EmitCall(OpCodes.Call, ctx.GetWriterMethodInfo(typeof(ushort)), null);
// +1 for 0 (null)
var jumpTable = new Label[map.Count + 1];
jumpTable[0] = il.DefineLabel();
foreach (var kvp in map)
jumpTable[kvp.Value.TypeID] = il.DefineLabel();
il.Emit(OpCodes.Ldloc_S, idLocal);
il.Emit(OpCodes.Switch, jumpTable);
D(il, "eihx");
il.ThrowException(typeof(Exception));
/* null case */
il.MarkLabel(jumpTable[0]);
il.Emit(OpCodes.Ret);
/* cases for types */
foreach (var kvp in map)
{
var type = kvp.Key;
var data = kvp.Value;
il.MarkLabel(jumpTable[data.TypeID]);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(type.IsValueType ? OpCodes.Unbox_Any : OpCodes.Castclass, type);
if (data.WriterMethodInfo.IsGenericMethodDefinition)
{
Debug.Assert(type.IsGenericType);
var genArgs = type.GetGenericArguments();
il.EmitCall(OpCodes.Call, data.WriterMethodInfo.MakeGenericMethod(genArgs), null);
}
else
{
il.EmitCall(OpCodes.Call, data.WriterMethodInfo, null);
}
il.Emit(OpCodes.Ret);
}
}