正月といえば、やはりプログラミングですよね。
前回は .NET Framework 3.5 の WPF を使いました。
それは Windows 7 なら最初から必ず入っているからという理由もありますが。
実は .NET 4.0 でやってみたけど上手くいかなかったから…
やはり現在の最新技術である 4.0 を使ってみたいじゃないですか。
ということで色々と自分で実験してみた。
技術文書とかは読まず(解らないもん)自力で漁った結果と前置きして。
.NET 3.5 での reference はカレント及び csc.exe のディレクトリ
それと C:\Windows\assembly を探すようだ。
このファイルに見えるものは実態ではない、端末で見れば解る。
Linux ばかり使っていて良かった、以前なら端末で見ようなんて絶対に思わない。
サブディレクトリ内に実態がある、正直なんだかよく解らない。
とにかく 4.0 の csc.exe ではこの位置の PresentationCore.dll は見つけられない。
4.0 の csc.exe があるディレクトリをよく見ると、ぶっちゃけ下記だが
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
に WPF というディレクトリがありソコにも PresentationCore.dll 等が。
ということはコッチを /lib オプションで指定すればいいようだ。
/lib 指定でビルド、System.Xaml.dll が見つからないとエラー…
って .NET 3.5 までは System.Xaml アセンブリなんて無かったような気がするんだが。
上記 assembly ディレクトリを漁ってもやはり見当たらないし。
WPF 4(VS 2010&.NET 4シリーズ) ? @IT
どうも .NET Framework 4.0 からのようで、XAML を使っていなくても必要なのね。
csc.exe のディレクトリ直下にある、ので System.Xaml.dll を参照追加指定だけ。
暗黙のリンクはやってくれない、何か事情があるのだろう。
ところで 64bit ディレクトリ指定にして配布は大丈夫なのだろうか?
exe に位置情報が埋め込まれていたりすると 32bit では動かないんだが。
32bit と 64bit の csc.exe でビルドして diff してみる。
exe 名以外は特に違いが見つからない、というかパス情報は無いみたい。
というかどちらも AnyCPU ビルドなんだからほとんど同じものが作られるんだね。
ネイティブで動くか WOW64 で動くかの違いだけなのかな?
どっちでも同じなら 32bit 位置指定のほうが心配が少なそうだから今後はそれで。
ということで 64 でないほうのディレクトリ指定でバッチを作る。
build32.bat
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe ^ /lib:C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF ^ /reference:System.Xaml.dll ^ /reference:PresentationCore.dll ^ /reference:PresentationFramework.dll ^ /reference:WindowsBase.dll ^ /target:winexe ^ /out:TextReader.exe ^ /win32icon:icon.ico ^ /optimize+ ^ src.cs PAUSE
v4.0.30319 というディレクトリ名は皆同じなんだろうか…
この Blog は自分で作って自分で使う(遊ぶ)人向けなのだからオケということで。
ということで今回は自分で復習のつもりでテキストリーダーを作ってみた。
UTF-8 以外は文字化けします、私は全部 UTF-8 保存しているので問題無し。
エントリポイントが解りにくいので __main__ という名前にしたw
src.cs
using System;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Microsoft.Win32;
class TextReader : Window
{
private TextBox _textbox;
public TextReader()
{
this.Title = "てきすとりぃだぁ!";
this.Width = 400;
this.Height = 400;
this.CreateControls();
}
private void CreateControls()
{
_textbox = new TextBox();
_textbox.TextWrapping = TextWrapping.NoWrap;
_textbox.AcceptsReturn = true;
_textbox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
_textbox.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
// Button
var button = new Button();
button.Content = "Open the Text";
//button.Click += new RoutedEventHandler(on_button_click);
button.Click += on_button_click;
DockPanel.SetDock(button, Dock.Top);
// DockPanel
var dockpanel = new DockPanel();
// Append
dockpanel.Children.Add(button);
dockpanel.Children.Add(_textbox);
this.Content = dockpanel;
}
void on_button_click(object sender, RoutedEventArgs e)
{
var dlg = new OpenFileDialog();
var res = dlg.ShowDialog(this);
if (res.Value)
{
var sr = new StreamReader(dlg.FileName, Encoding.UTF8);
_textbox.Text = sr.ReadToEnd();
sr.Close();
}
}
}
class __main__
{
[STAThread]
public static void Main(string[] args)
{
var app = new Application();
app.Run(new TextReader());
}
}
new RoutedEventHandler() を使わずにイベントハンドラが追加できたんだが…
以前からそうなのかな、VisualStudio だと強制的に書き込まれるはずなんだが。
余計な new が少ないのは嬉しいよ。
.NET 4.0 なので Microsoft.Win32 名前空間のダイアログも最新だ。
それ以外は 4.0 の恩恵が何も無いという…
3.0 時のような劇的進化は特に無いし 3.5 でイイやとか思ってしまうよ。
とにかく .NET 4.0 でも何もインストールせずに遊ぶ方法が解ったのでよし。



