Metro Style AppsでMSIL(Win8RP対応版)
Metro Style AppsでMSILver.2012/06/09
EXEを生成する部分のコード抜粋
var exeName = "text.exe"; //----------------------------------------------------------------- // アセンブリ保存先を選択 var picker = new FileSavePicker(); picker.SuggestedStartLocation = PickerLocationId.Desktop; picker.FileTypeChoices.Add("Console Application", new string[] { ".exe" }); picker.DefaultFileExtension = ".exe"; picker.SuggestedFileName = exeName; var file = await picker.PickSaveFileAsync(); //----------------------------------------------------------------- // モジュールの作成 var module = ModuleDefinition.CreateModule(exeName, ModuleKind.Console); module.Assembly.Name.Name = exeName; // クラスの作成 var type = new TypeDefinition( "Some.Namespace", "SomeType", TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract, module.TypeSystem.Object); module.Types.Add(type); // メソッドを作成(この時点ではメソッドの中身は空) var method = new MethodDefinition( "Main", MethodAttributes.Private | MethodAttributes.Static, module.TypeSystem.Void); method.DeclaringType = type; method.CallingConvention = MethodCallingConvention.Default; method.ImplAttributes = MethodImplAttributes.Managed; type.Methods.Add(method); // System.Console#WriteLine() メソッドへの参照を作成 var corlib = module.TypeSystem.Corlib; var objectTypeReference = module.Import( new TypeReference("System", "Object", null, corlib, false)); var writeLineMethod = new MethodReference( "WriteLine", new TypeReference("System", "Void", null, corlib, true), new TypeReference("System", "Console", null, corlib, false)) { Parameters = { new ParameterDefinition(objectTypeReference) } }; writeLineMethod = module.Import(writeLineMethod); // メソッドの本体を定義(MSILっぽい部分) var il = method.Body.GetILProcessor(); il.Emit(OpCodes.Ldstr, "Hello World"); il.Emit(OpCodes.Call, writeLineMethod); //System.Console#WriteLine()をコール il.Emit(OpCodes.Ret); // エントリーポイント(main)を設定 module.EntryPoint = method; //----------------------------------------------------------------- // アセンブリを保存 using (var memStream = new MemoryStream()) using (var fileStream = await file.OpenStreamForWriteAsync()) { module.Write(memStream); memStream.Position = 0; memStream.CopyTo(fileStream); } //----------------------------------------------------------------- // 終了メッセージを出しとく await new MessageDialog("アセンブリを生成しました").ShowAsync();