Skip to content

Instantly share code, notes, and snippets.

@urasandesu
Created January 18, 2014 13:00
Show Gist options
  • Save urasandesu/8490155 to your computer and use it in GitHub Desktop.
Save urasandesu/8490155 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
namespace EHTrial
{
class Program
{
static void Main(string[] args)
{
var pMSCorLib = Assembly.Load("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86");
var pMSCorLibDll = pMSCorLib.GetModule("CommonLanguageRuntimeLibrary");
var pVoid = pMSCorLibDll.GetType("System.Void");
var pInt32 = pMSCorLibDll.GetType("System.Int32");
var pString = pMSCorLibDll.GetType("System.String");
var pStreamReader = pMSCorLibDll.GetType("System.IO.StreamReader");
var pChar = pMSCorLibDll.GetType("System.Char");
var pIOException = pMSCorLibDll.GetType("System.IO.IOException");
var pTextReader = pMSCorLibDll.GetType("System.IO.TextReader");
var pException = pMSCorLibDll.GetType("System.Exception");
var pConsole = pMSCorLibDll.GetType("System.Console");
var pObject = pMSCorLibDll.GetType("System.Object");
var pStreamReader_ctor_string = default(ConstructorInfo);
{
var @params = new List<Type>();
@params.Add(pString);
pStreamReader_ctor_string = pStreamReader.GetConstructor(@params.ToArray());
}
var pTextReader_ReadBlock_CharArr_Int32_Int32 = default(MethodInfo);
{
var @params = new List<Type>();
@params.Add(pChar.MakeArrayType());
@params.Add(pInt32);
@params.Add(pInt32);
pTextReader_ReadBlock_CharArr_Int32_Int32 = pTextReader.GetMethod("ReadBlock", @params.ToArray());
}
var pTextReader_Close = pTextReader.GetMethod("Close");
var pException_get_Message = pException.GetMethod("get_Message");
var pConsole_WriteLine_string_object_object = default(MethodInfo);
{
var @params = new List<Type>();
@params.Add(pString);
@params.Add(pObject);
@params.Add(pObject);
pConsole_WriteLine_string_object_object = pConsole.GetMethod("WriteLine", @params.ToArray());
}
var pMSCorLibEHGen = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("mscorlib.EH"), AssemblyBuilderAccess.RunAndSave);
var pMSCorLibEHDllGen = pMSCorLibEHGen.DefineDynamicModule("mscorlib.EH.dll");
var pEHClassGen = pMSCorLibEHDllGen.DefineType("mscorlib.Prig.EHClass",
TypeAttributes.Public |
TypeAttributes.AutoClass |
TypeAttributes.AnsiClass |
TypeAttributes.BeforeFieldInit);
var pEHClassGen_ReadFile = default(MethodBuilder);
{
var @params = new List<Type>();
@params.Add(pString);
@params.Add(pInt32);
pEHClassGen_ReadFile = pEHClassGen.DefineMethod("ReadFile",
MethodAttributes.Public |
MethodAttributes.HideBySig,
CallingConventions.Standard,
pVoid,
@params.ToArray());
}
{
var pBodyGen = pEHClassGen_ReadFile.GetILGenerator();
var pLocal0_file = pBodyGen.DeclareLocal(pStreamReader);
var pLocal1_buffer = pBodyGen.DeclareLocal(pChar.MakeArrayType());
var pLocal2_e = pBodyGen.DeclareLocal(pIOException);
var label0 = pBodyGen.DefineLabel();
pBodyGen.Emit(OpCodes.Ldnull);
pBodyGen.Emit(OpCodes.Stloc_0);
pBodyGen.Emit(OpCodes.Ldc_I4_S, (byte)10);
pBodyGen.Emit(OpCodes.Newarr, pChar);
pBodyGen.Emit(OpCodes.Stloc_1);
pBodyGen.BeginExceptionBlock();
{
pBodyGen.Emit(OpCodes.Ldarg_1);
pBodyGen.Emit(OpCodes.Newobj, pStreamReader_ctor_string);
pBodyGen.Emit(OpCodes.Stloc_0);
pBodyGen.Emit(OpCodes.Ldloc_0);
pBodyGen.Emit(OpCodes.Ldloc_1);
pBodyGen.Emit(OpCodes.Ldarg_2);
pBodyGen.Emit(OpCodes.Ldloc_1);
pBodyGen.Emit(OpCodes.Ldlen);
pBodyGen.Emit(OpCodes.Conv_I4);
pBodyGen.Emit(OpCodes.Callvirt, pTextReader_ReadBlock_CharArr_Int32_Int32);
pBodyGen.Emit(OpCodes.Pop);
}
pBodyGen.BeginCatchBlock(pIOException);
{
pBodyGen.Emit(OpCodes.Stloc_2);
pBodyGen.Emit(OpCodes.Ldstr, "Error reading from {0}. Message = {1}");
pBodyGen.Emit(OpCodes.Ldarg_1);
pBodyGen.Emit(OpCodes.Ldloc_2);
pBodyGen.Emit(OpCodes.Callvirt, pException_get_Message);
pBodyGen.Emit(OpCodes.Call, pConsole_WriteLine_string_object_object);
}
pBodyGen.BeginFinallyBlock();
{
pBodyGen.Emit(OpCodes.Ldloc_0);
pBodyGen.Emit(OpCodes.Brfalse_S, label0);
pBodyGen.Emit(OpCodes.Ldloc_0);
pBodyGen.Emit(OpCodes.Callvirt, pTextReader_Close);
pBodyGen.MarkLabel(label0);
}
pBodyGen.EndExceptionBlock();
pBodyGen.Emit(OpCodes.Ret);
}
pEHClassGen.CreateType();
pMSCorLibEHGen.Save("mscorlib.EH.dll", PortableExecutableKinds.ILOnly, ImageFileMachine.I386);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment