diff --git a/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs b/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs index 30b5a4d759b..4b3ab7e917c 100644 --- a/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs +++ b/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs @@ -94,13 +94,34 @@ public void EmitMethodBody(MethodBuilder proxyMethod, MethodBuilder callbackMeth private static void EmitBaseMethodCall(ILGenerator IL, MethodInfo method) { - IL.Emit(OpCodes.Ldarg_0); + if (method.IsAbstract) + { + if (!method.ReturnType.IsValueType) + { + IL.Emit(OpCodes.Ldnull); + } + else if (method.ReturnType != typeof(void)) + { + var local = IL.DeclareLocal(method.ReturnType); + IL.Emit(OpCodes.Ldloca, local); + IL.Emit(OpCodes.Initobj, method.ReturnType); + IL.Emit(OpCodes.Ldloc, local); + } + + IL.Emit(OpCodes.Ret); + } + else + { + IL.Emit(OpCodes.Ldarg_0); - for (int i = 0; i < method.GetParameters().Length; i++) - IL.Emit(OpCodes.Ldarg_S, (sbyte) (i + 1)); + for (int i = 0; i < method.GetParameters().Length; i++) + { + IL.Emit(OpCodes.Ldarg_S, (sbyte) (i + 1)); + } - IL.Emit(OpCodes.Call, method); - IL.Emit(OpCodes.Ret); + IL.Emit(OpCodes.Call, method); + IL.Emit(OpCodes.Ret); + } } private static void SaveRefArguments(ILGenerator IL, ParameterInfo[] parameters)