Windows 7 C# Build @ WPF

久々に Windows を使っているけど IronPython が遅すぎる。
コンパイル不要でライブラリも .NET がほぼフルで使えるので困らないし何より簡単。
なのはいいのだけれど、DLR 初期化が遅すぎて道具として使う気にならない。
地味に小物ツールを作っているんだけれど使わない…

コンパイルするなら C# で作ったほうが楽だし Web 上の Tip’s も C# なら桁違い。
それより何より Windows 7 なら何もインストールせずに C# がビルドできる。

Windows 7 の csc.exe で遊んでみる

なんか IronPython も将来性が不安な雰囲気だし。

米Microsoft、IronRubyおよびIronPythonをコミュニティに移管 – SourceForge.JP Magazine : オープンソースの話題満載

もう Windows は C# を主に利用するほうが懸命かと。
SeeMe も次で C# に戻すか考えなければ。

ということで今回は VisualStudio 等を一切使わずに WPF ウインドウを作る方法を。

VisualStudio を使ったほうが簡単だ!と言わない。
Linux ばかり使っている人間はテキストエディタとコンソールのほうが楽なんじゃい。
小物のツールを作るのに統合開発環境なんてバカな話だ。
本音は Visual C# だかの無償開発環境をインストールして何も作れない人を馬鹿にしたいから。

Microsoft.Win32.OpenFileDialog for .NET 4.0

IronPython は clr.AddReferenceByPartialName() メソッドでアセンブリ参照の追加ができた。
けど C# は同じようにコードでアセンブリ参照を追加する方法が見つからない。
というかコンパイル時に厳しい文法チェックを行う C# ではソレは無理なのかな。
素直にコンパイラオプションで参照する方法を MSDN で探す。

C# Compiler Options Listed by Category

/reference オプションを利用するだけなのか。
アイコンも /win32icon オプションだけで指定できる、VC++ より簡単だ。
引数が多くて長いのでバッチを作ったほうが楽だね。

build.bat

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe ^
/reference:PresentationCore.dll ^
/reference:PresentationFramework.dll ^
/reference:WindowsBase.dll ^
/target:winexe ^
/out:net35wpf.exe ^
/win32icon:777.ico ^
/optimize+ ^
wpf_win.cs
PAUSE

この例は .NET 3.5 の csc.exe を使うのでフルパスを、32bit の人はパスを書き換えてね。
^ を利用すればインラインなコマンドを改行できる、bash は \ だけど。
最後に PAUSE と書けば *.bat の W クリックでコンソールが閉じないのでお勧め。
アイコンは勝手に用意して書き換えよろしく。

肝心な C# コードはせっかくなので Binding を使ってみた。
Main 関数に Single Thread Apartment 属性は必須なので忘れずに。
あ、BOM 付き UTF-8 で保存ね。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;

class OreWin : Window
{
	private TextBox _textbox;
	private TextBlock _textblock;

	public OreWin()
	{
		this.Title = "俺のういんどう!";
		this.Width = 400;
		this.Height = 120;
		this.DataContext = _textbox;
		this.CreateControls();
		// Binding
		var binding = new Binding("Text");
		binding.Source = _textbox;
		_textblock.SetBinding(TextBlock.TextProperty, binding);
	}
	private void CreateControls()
	{
		_textbox = new TextBox();
		_textblock = new TextBlock();
		var label = new TextBlock(new Bold(new Run("何か書くと下にコピーされる")));
		var stackpanel = new StackPanel();
		// Append
		stackpanel.Children.Add(label);
		stackpanel.Children.Add(_textbox);
		stackpanel.Children.Add(_textblock);
		this.Content = stackpanel;
	}
}

class Test
{
	// WPF 等では STA 属性必須!
	[STAThread]
	public static void Main(string[] args)
	{
		var win = new OreWin();
		var app = new Application();
		app.Run(win);
	}
}
//

Pascal & C++ 屋だった頃は勘違いしやすい var に否定的だったけど…
Python 屋になった後では var と書くのすら面倒臭くなってしまった。
つーかメンバアクセスに this を書かなければ気がすまなくなっているのが怖い。
new もウザい、セミコロンを忘れる、メンバ変数も this にくっつけ…(以下略
C# って何か中途半端な気がする、まあ従うだけだが。

とにかく build.bat を W クリックしてコンパイル。
アイコンを含めたコードも置いてみる。

wpf_win_src.zip

よしよし、何もインストールしないでコンパイルできたぞと。
しかも起動はアッという間、IronPython をやっていたのが馬鹿馬鹿しい。
来年からはこんな感じで Windows でも小物を作っていきますか。

******************************

2010 年の反省、サイトもブログも更新歩度が下がり続けている。
ヤル気が無くなったわけではない、株を始めたので勉強に忙しいのです。

ちなみに今年のアフィリエイト収入は三千円ちょっと…
たった二十万円で始めた株は四ヶ月で一割強増えた…
当然のように株の更なる勉強と増資の日々に…

Linux プログラミング Blog なんてアホくさくてやってらんねぇ!
いくら Linux でのアプリ作りが主な記事の Blog だからってコレでは…

やはり Windows プログラミングをもう少し増やしたほうが良さそう。
というわけでまた来年。