Пусть у нас есть абстрактный класс:
public abstract class HelloWorldAbstract
{
public abstract void HelloWorld();
}
Для него, используя Reflection.Emit мы хотим создать наследника реализующего этот абстрактный метод:
public static Type GetHelloWorldType()
{
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "HelloWorldAssembly";
string asmFileName = "HelloWorldModule.dll";
AssemblyBuilder assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.RunAndSave, @"D:\Projects\ReflectionEmitLearning\bin" );
ModuleBuilder moduleBuilder =
assemblyBuilder.DefineDynamicModule( "HelloWorldModule", asmFileName );
TypeBuilder typeBuilder =
moduleBuilder.DefineType( "HelloWorldClass"
, TypeAttributes.Public, typeof(HelloWorldAbstract) );
MethodBuilder methodBuilder =
typeBuilder.DefineMethod( "HelloWorld"
, MethodAttributes.Public
, null, null );
ILGenerator il = methodBuilder.GetILGenerator();
// Генерируем код.
MethodInfo getCurrentContextMI = typeof(HttpContext).
GetMethod( "get_Current" );
MethodInfo getResponseMI = typeof(HttpContext).
GetMethod( "get_Response" );
MethodInfo responseWriteMI = typeof(HttpResponse).
GetMethod( "Write", new Type[] {typeof (string)} );
il.EmitCall( OpCodes.Call, getCurrentContextMI, null );
il.EmitCall( OpCodes.Callvirt, getResponseMI, null );
il.Emit( OpCodes.Ldstr, "Hello World!" );
il.EmitCall( OpCodes.Callvirt, responseWriteMI, null );
il.Emit( OpCodes.Ret );
Type result = typeBuilder.CreateType();
assemblyBuilder.Save( asmFileName );
return result;
}
В отмеченном месте генерится ошибка, говорящая о том, что абстрактный метод HelloWorld не был реализован. Я так понимаю, что в это месте:
MethodBuilder methodBuilder =
typeBuilder.DefineMethod( "HelloWorld"
, MethodAttributes.Public
, null, null );
необходимо добавить еще какой-то MethodAttribute. Однако значения 'Override' для этого перечисления я так и не увидел. А все остальные варианты кажутся не подходящими Можете помочь решить проблему?
|