スキップしてメイン コンテンツに移動

System.CodeDom

今回はSystem.CodeDom名前空間 のクラスたちで遊ぶ。CodeDomのクラスを用いるとソースコードの構成をクラスで表現することが出来る。例のごとくHelloWorldを作成してみる。

CodeCompileUnit compileiUnit = new CodeCompileUnit();

//名前空間追加
CodeNamespace sampleNamespace = new CodeNamespace("CodeDomSample");
compileiUnit.Namespaces.Add(sampleNamespace);

//System名前空間をインポート
CodeNamespaceImport systemImport = new CodeNamespaceImport("System");
sampleNamespace.Imports.Add(systemImport);

//クラス追加
CodeTypeDeclaration programType = new CodeTypeDeclaration("Program");
programType.IsClass = true;
sampleNamespace.Types.Add(programType);

//メソッド追加
CodeEntryPointMethod mainMethod = new CodeEntryPointMethod();
programType.Members.Add(mainMethod);

//メソッド内処理の設定
CodeMethodInvokeExpression hello = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("Console"),
                                                                  "WriteLine",
                                                                  new CodePrimitiveExpression("Hello World"));

CodeExpressionStatement consoleWriteStatement = new CodeExpressionStatement(hello);
mainMethod.Statements.Add(consoleWriteStatement);

大きな流れは

  1. CodeCompileUnitクラスのオブジェクトを生成
  2. CodeCompileUnitオブジェクトに名前空間を追加
  3. 名前空間オブジェクトにタイプ(クラス)を追加
  4. タイプオブジェクトにメンバ(メソッド)追加
  5. メソッドにステートメント(処理)を追加
となる。
これをCodeDomProviderクラスを継承したクラスに渡せばソースコードファイルを生成することができる。

private void GenerateCodeFile(CodeCompileUnit unit)
{
    Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
    string fileName = "HelloWorld." + provider.FileExtension;
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(fileName))
    {
        System.CodeDom.Compiler.CodeGeneratorOptions options = new System.CodeDom.Compiler.CodeGeneratorOptions();
        options.IndentString = "    ";
        provider.GenerateCodeFromCompileUnit(unit, writer, new System.CodeDom.Compiler.CodeGeneratorOptions());
        writer.Close();
    }
}

生成されたHelloWorldソースは以下

//------------------------------------------------------------------------------
// 
//     このコードはツールによって生成されました。
//     ランタイム バージョン:2.0.50727.1433
//
//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
//     コードが再生成されるときに損失したりします。
// 
//------------------------------------------------------------------------------

namespace CodeDomSample {
    using System;

    public class Program {
        
        public static void Main() {
            Console.WriteLine("Hello World");
        }
    }
}

auto-generatedのコメントは消せないのかな。

コメント

このブログの人気の投稿

VirtualBoxのUbuntu 18.04でNAT + ホストオンリーアダプター

VirtualBoxのVMにインストールしたUbuntu Server 18.04で、ネットワーク割当を「NAT」+「ホストオンリーアダプター」にする場合の設定についてメモ。 VMを作るとき、ゲストOSからインターネットに繋がって、かつホスト-ゲスト間でもつながる環境にしたいとき、VMのネットワーク割当は手っ取り早いのは「ブリッジアダプター」なんだけど、会社のネットワークでは都合がわるかったりするので「NAT」+「ホストオンリーアダプター」にしている。 アダプター1は「NAT」を選択 アダプター2は「ホストオンリーアダプター」を選択 ゲストOSであるUbuntuのネットワーク設定は、NATに該当するNICはDHPCで、ホストオンリーアダプターに該当するNICは固定IPとする。 Ubuntu 18.04ではネットワーク設定はNetplanで行う(Ubuntu 17.10から変わったようだ)。編集する設定ファイルは「/etc/netplan/50-cloud-init.yaml」 network: ethernets: {NATのNIC}: addresses: [] dhcp4: true optional: true {ホストオンリーアダプターのNIC}: addresses: [{固定IPアドレス}] dhcp4: no version: 2 ポイントは、ホストオンリーアダプターに該当するNICの固定アドレスを設定するときに、 ゲートウェイを設定しない こと。 以前に QiitaのVirtualBoxでNAT + Host-Only Network環境を構築する を参考にしていたのに、今回18.04で設定する際にすっかり忘れてはまってしまった。 IPアドレスは「192.168.0.2/24」のようにサブネットマスクも指定する。 NICに指定するデバイス名は以下コマンドで表示されるlogical nameが該当する。 > lshw -class network たいていは「enp0s3」「enp0s8」となるようだ。 設定ファイルを保存したら

画像を切り取って保存する

画像処理において、画像の一部を切り出すことをトリミングというらしい。画像編集ソフトなんかにも大抵「トリミング」機能が実装されているだろう。 そんな画像を切り取る処理を.NETでやってみる。 .NETでは画像を扱う際にはBitmapクラスを使用する。BitmapクラスのCloneメソッドでサイズを指定すれば、そのサイズのBitmapオブジェクトができるので、それを保存すればよい。Cloneメソッドの引数はRectangle構造体とPixelFormat列挙体。 Rectangle構造体とは四角形の位置とサイズを表したもの。元画像の左上を(0, 0)として(X座標, Y座標, 幅, 高さ)の値でRectangle構造体を作成して渡す。PixelFormat列挙体はヘルプを見てもよくわからなかった。とりあえずは元画像の値をそのまま渡す。 例えば photo by tsukacyi のようなユッケの画像をトリミングするプログラムは以下のように書ける '元画像 Dim source As Bitmap source = New Bitmap("source.jpg") '切り取るサイズ Dim rect As Rectangle rect = New Rectangle(30, 80, 400, 320) '切り取り後の画像 Dim trimed As Bitmap trimed = source.Clone(rect, source.PixelFormat) '保存 trimed.Save("trimed.jpg") source.Dispose() trimed.Dispose() トリミング後の画像は以下の通り。

「Lively」ベータ開始

Googleが3D仮想空間 「Lively」 のベータ版を開始したらしいので、試しにやってみた。 グラフィックボードを搭載していない、オンボードなPCなのだが、それなりに動作するのが驚いた。比較されるであろう「Second Life」はやったことなく、3D仮想空間とやらは初めてなのだが、なかなか面白い。 試しに 「Chuta's Room」 を作ってみた。中にいくつかこのエントリへのリンクも仕込んでおいた。もしLivelyから来られた方は、コメントでも残していただけると有難い。