PowerShell Memo

このサイトはPowerShell(MSH/Monad)奮闘記です

管理人「newpops吉岡洋」が
「PowerShell(旧名:MSH/Monad)」の研究結果を日々綴っていきます。

【お知らせ】
この日記からPowerShellのTipsを抽出し「PowerShell FAQ」として整理しました。


2005-09-21

newpops2005-09-21

[]MSHでGUIプログラミング

今日はWorking with Objectsを参考にGUIプログラミングです♪

GUIと言えば「system.windows.forms」

.NETではお馴染み、GUIと言えば「system.windows.forms」クラスです。

早速、Working with Objectsのサンプルを実行してみます。

$form = new-object system.windows.forms.form
$form.topmost = $true
$button = new-object system.windows.forms.button
$button.Dock = "Fill"
$button.Text = get-date
$button.Add_Click({$button.Text = get-date})
$form.Controls.add($button)
$form.showdialog()

すると、大量のエラーコード。

エラーコードを見ると、

new-object : Cannot find type [system.windows.forms.form]:

make sure the assembly containing this type is loaded.

「system.windows.forms.form」が見つからないようです。

FormクラスをMSDNで調べてみると、


アセンブリ: System.Windows.Forms (System.Windows.Forms.dll 内)

とありますので、System.Windows.Forms.dllがロードされていないのでしょうか?


現在ロードされているアセンブリを確認してみましょう。

MSH C:\> [System.AppDomain]::CurrentDomain.GetAssemblies()

GAC    Version        Location
---    -------        --------
True   v2.0.50215     C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll
False  v2.0.50215     C:\Program Files\Microsoft Command Shell\msh.exe
・
・
・

確かに、System.Windows.Formsアセンブリ(System.Windows.Forms.dll)はロードされていないようです。

エクスプローラで「C:\WINDOWS\assembly」を開くと「System.Windows.Forms」が存在しますので、

GAC(グローバルアセンブリキャッシュ)からアセンブリをロードしましょう。

GACからアセンブリをロードするには、LoadWithPartialNameメソッド利用します。

MSH C:\> [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

GAC    Version        Location
---    -------        --------
True   v2.0.50215     C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\
2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll


MSH C:\>

アセンブリがロードされました。


再度、先ほどのサンプルを実行してみます。

$form = new-object system.windows.forms.form
$form.topmost = $true
$button = new-object system.windows.forms.button
$button.Dock = "Fill"
$button.Text = get-date
$button.Add_Click({$button.Text = get-date})
$form.Controls.add($button)
$form.showdialog()

成功です。フォームが表示されました。(^^)(画像参照)


ちなみに、LoadWithPartialNameメソッドでアセンブリロード後の、

ロードアセンブリ情報を表示したくない場合は、先頭に[void]をつけて下さい。

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")