2012年10月31日水曜日

STAThread属性って何?

前々から気になっていた「STAThread属性」。
これって、いったい何なのか?

気になってしょうがないので少し調べてみました。

STAThreadAttribute クラス(MSDN)には、次のように書いてあります。

アプリケーションの COM スレッド モデルがシングルスレッド アパートメント (STA: Single-Threaded Apartment) であることを示します。
はい、言っている意味がまったく分かりません。


そんでもって、Windows フォームのエントリ ポイントを STAThread でマークします(MSDN)には、次のように書いてあります。

STAThreadAttribute は、アプリケーションの COM スレッド処理モデルがシングルスレッド アパートメントであることを示します。この属性は、Windows フォームを使用するすべてのアプリケーションのエントリ ポイントに指定する必要があります。省略すると、Windows コンポーネントが正常に機能しないことがあります。属性がない場合、アプリケーションではマルチスレッドのアパートメント モデルを使用します。このモデルは、Windows フォームでサポートされていません。
ほう、Windows フォームを使用するすべてのアプリケーションのエントリ ポイントには「STAThread属性」を必ず指定する必要があるんですね。

「STAThread属性」を指定しないと、Windows フォームではサポートされていない「マルチスレッドのアパートメント モデル」を使用することになり、正常に機能しなくなると。

なるほど!!
「シングルスレッド アパートメント」や「マルチスレッド アパートメント」に関しては、まったく分かりませんが、今のところは、Windows フォームで作るアプリケーションには「STAThread属性」を必ず指定する必要がある。ということが分かれば十分です。

名前空間(namespace)に関する疑問

C#の名前空間で、気になっていたことを調べたので、その記録。


C#って「グローバル名前空間」ってあるのか?

どうやらC#にも「グローバル名前空間」はあるみたい。
C++を勉強したときに「名前空間」はグローバルスコープを分けるものだと理解しているので、C#でも「グローバル名前空間」があるのは当たり前か。


C#にもグローバル名前空間があるってことは、「グローバル名前空間で変数を宣言できるのか?

調べてみたら、C#の名前空間で宣言できる型は次の6つ。
  • 名前空間
  • class
  • interface
  • struct
  • enum
  • delegate
「名前空間」は型とは言えないだろうけど、含めてます。
詳しくは、MSDNの「namespace (C# リファレンス)」を参照してください。
(こちらにも、似たようなことが書かれていました「C# プログラムの一般構造」)

ちなみに、名前空間で変数を宣言すると、コンパイラに怒られます!


グローバル名前空間から指定するには “global::”を使います。
“::”は「名前空間エイリアス修飾子」といいます。

System.Console.WriteLineメソッドをグローバル名前空間から指定すると次のようになる。


これを実行すると、こんな感じ。


普通に「System.Console.WriteLineメソッド」が呼ばれます。
この例では、何のために「global::」を使うのかが分かりづらいとおもいますが、グローバル名前空間の指定は「曖昧さの解決(名前解決)」に使うためのものだと思います。おそらく、あまり使う機会はなさそうです。

最後に「グローバル名前空間」について参考になったページを紹介。

これすごく分かりやすい。
↓ ↓ ↓



2012年10月29日月曜日

windows ストア アプリのHelloWorld その2(c#)

前回の「windows ストア アプリのHelloWorld その1(c#)」のつづきです。

以下の内容は「"Hello, world" アプリを作成する(手順 3: スタート ページの変更)」を自分で作成した時の記録です。

MainPage.xamlを開き、XAMLデザイナーで "My Application" をクリック。



プロパティパネルの名前の欄に「pageTitle」、種類の欄に「TextBlock」と表示されているのを確認し、共通のTextプロパティの右側にあるボタンをクリック。



値の欄に「Hello, world!」と入力しOKボタンをクリック。
これで、Textプロパティが参照しているリソース(AppName)の編集が完了。



編集した結果は、すぐコードに反映される。



以下のコードをxamlに追加し、要素を追加する。
↓ ↓ ↓
<StackPanel Grid.Row="1" Margin="120,30,0,0">
<TextBlock Text="What's your name?"/>
<StackPanel Orientation="Horizontal" Margin="0,20,0,20">
<TextBox x:Name="nameInput" Width="300" HorizontalAlignment="Left"/>
<Button Content="Say &quot;Hello&quot;"/>
</StackPanel>
<TextBlock x:Name="greetingOutput"/>
</StackPanel>


ビルドして実行すると、こんな感じになる。



windows ストア アプリのHelloWorld その1(c#)

今日ついにWindows8が発売されましたね。
さっそくWindows8へアップグレード!!タッチパネル操作はできませんが・・・


Visual Studio Express 2012 for Windows 8をインストールしたので、
windowsストアアプリの作り方の勉強開始!!



この記事で紹介している"HelloWorldアプリ"は、「パート 1: "Hello, world" アプリを作成する (C#/VB と XAML を使った Metro スタイル アプリ)」の内容をそのまま試したものです。

ただ、一部説明がわかりづらい部分があったので、作業手順を記録しておきます。


それでは、windows ストア アプリでHelloWorldを作成します!

「Visual Studio Express 2012 for Windows 8」を起動し、メニューから[ファイル] → [新しいプロジェクト]の順にクリック。


つぎのような画面が表示されるので、[インストール済み] → [Windowsストア] → [新しいアプリケーション]の順に選択します。つづけて[名前]の欄に「HelloWorld」と入力して[OK]ボタンをクリックします。


これで、プロジェクトの作成は完了!!
[新しいアプリケーション]テンプレートは、「最小限のwindowsストア アプリ」を作成するためのものだそうです。ここまでの作業で次のように表示されます。



プロジェクトを作成すると自動でいくつかのファイルが作成されます。作成されたファイルはソリューションエクスプローラで確認できます(下の画像)。

なお、「新しいアプリケーションテンプレート」以外の「グリッドアプリケーションテンプレート」や「分割アプリケーションテンプレート」を使用してプロジェクトを作成すると、「~Page.xaml」ファイルの数が増えます。「新しいアプリケーションプロジェクト」で作成した場合は、「MainPage.xaml」ファイルが一つだけ作成されます(下の画像)。

ファイル数の違いからも「新しいアプリケーションテンプレート」は、「最小限のwindowsストア アプリ」を作成するためのものだと確認できます。ほかのテンプレートでプロジェクトを作成したファイルの違いを比べてみてください。



それでは、HelloWorldアプリの作成をつづけます。
パート 1: "Hello, world" アプリを作成する (C#/VB と XAML を使った Metro スタイル アプリ)」のやりかたでは、「MainPage.xaml」を削除して、もう一度「MainPage.xaml」を作成します。

正直、ここが少しわかりづらかった・・・。なんで削除して作り直すの?って感じでした。どうやら、単純なHelloWorldアプリを作るなら削除する必要はなさそう。

では何で作り直すか?というと。「パート 1: "Hello, world" アプリを作成する (C#/VB と XAML を使った Metro スタイル アプリ)」で作成する “HelloWorldアプリ” が単純なつくりではないから。

Windows ストア用のアプリを作成するために必要な知識をつけるための「HelloWorldアプリ」!みたいな感じだど思います。自動作成されるものよりも多機能なクラスを使ってアプリをつくるために、一度削除して作り直します。

それでは、「MainPage.xaml」を削除します。
MainPage.xamlを右クリックして、削除をクリックします。


削除メッセージが表示されたら、OKをクリックしいます。


「MainPage.xaml」を作成します。
メニューから[プロジェクト] → [新しい項目の追加] の順にクリック。


[windowsストア] → [基本ページ] の順にクリックします。
名前に「MainPage」と入力し追加ボタンをクリックします。


[はい]をクリックしいます。
[はい]をクリックすると、ソリューションエクスプローラの「Commonフォルダ」に不足しているファイルが追加されます。


「MainPage.xaml」を作成すると、「デザインビューを更新するには、プロジェクトをビルドしてください」と表示されるので、ビルドします。


エラーがでなければ、HelloWorldアプリの最初のステップは完了です。
デバッグを開始して確認します。


デバッグを開始すると、最初にスプラッシュ画面が表示されます。ここに表示される画像は、ソリューションエクスプローラーのAssetsフォルダにある「SplashScreen.png」です。


スプラッシュ画面が消えると、アプリの画面が表示されます。


ここまでが、HelloWorldアプリの最初のステップです。
パート 1: "Hello, world" アプリを作成する (C#/VB と XAML を使った Metro スタイル アプリ)」をもとに作成しているので、こちらも確認してください。

そうそう、Amezonで「Windows8ストアアプリ開発入門 」という本を発見したので、さっそく予約しました!