読者です 読者をやめる 読者になる 読者になる

Metro Style AppsでMSIL(Win8RP対応版)

cod2012jp WinRT MSIL

Metro Style AppsでMSIL ver.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();