プロジェクトの種類と"My"

よくご厄介になる”My”名前空間ですが、プロジェクトの種類によってその中身が微妙に異なります。
よく考えてみなくても当たり前の話で、Web アプリケーションなのに “My.Computer.Registry”にアクセスできるとか、Windows フォームアプリケーションなのに”My.Response”にアクセスできるとか、そんなアホなことが出来て良いわけがありません。
そんなわけで、どんなプロジェクトの時にどの”My”にアクセスできるかの一覧はコチラ
MSDN:プロジェクトの種類に応じた My の機能 (2.0用)
MSDN:プロジェクトの種類に応じた My の機能 (3.5用)
でもって、”My”辺りの自動生成コードを眺めていると、やたらと”#IF _MYTYPE = … “ってのが出てきます。この”_MYTPE”でプロジェクトの種類を判別しています。この”_MYTYPE”ってのが何者か?どんな値をとるのか?ってのは、コチラです。
MSDN:My で利用可能なオブジェクトのカスタマイズ(2.0用)
MSDN:MSDN:My で利用可能なオブジェクトのカスタマイズ(3.5用)
この”_MYTYPE”、知っておいて損はないでしょう。使う機会はあまり想像できませんが…(コードの使いまわし再利用とかには使えそうです。)

【小ネタ】ソースコード中のXMLの文字の色

VS2008 の VB.NET では、こんな書き方ができます。

Dim hoge = <hoge>
      <fuga></fuga>
     </hoge>

引用符が無いところに注目してください。
でもって、VS2008 のフォントと色をカスタマイズしていると、やたらと見難くなる事があります。
「フォントと色」で変更しようとして、XMLとかXAMLとかを変更してみても、効果はありません。
これらは、「VB の XML…」で設定されています。
VBのXML...

VBの And Or 演算子はショートサーキットしない

何をイマサラな話題ですが。
VBの And, Or演算子は、ショートサーキットをしません。
ショートサーキットとは、簡単に言ってしまうと「条件が判定されたら、以降の判断は行わない」ってことです。
たとえば C系列や Java とかは、デフォルトでこれです。
なので、Cに詳しい人が書いてしまいがちなこんなコード、

[VB.NET]
Dim objHoge as List(Of String) ‘—Newもなにもしない
IF (objHoge is Nothing = false) And objHoge.Count < 10 THEN '...(以下略)

ちゃんと聞いているからOKと思うと、悲しく NullReferenceException で終わってしまいます。
二項目の”objHoge.Count”を評価しようとするわけです。
で、VB6までは、これしかなかったので、VB6までで痛い目にあったヒトビトは、よくこういう(冗長に見える)ソースを書いてました。

[VB.NET]
Dim objHoge as List(Of String) ‘—Newもなにもしない
IF (objHoge is Nothing = false) THEN
 IF objHoge.Count < 10 THEN   '...(以下略)

と、二段構えで聞いていたわけです。
で、VB.NET から出てきたのが、ショートサーキット対応の And, Or 演算子 – AndAlso と OrElse です。
この長い名前がなんともVBらしいわけなんですが、これを使うと、先ほどのコードは

[VB.NET]
Dim objHoge as List(Of String) ‘—Newもなにもしない
IF (objHoge is Nothing = false) AndAlso objHoge.Count < 10 THEN '...(以下略)

となり、エラーにもならず、思ったとおりの動作をしてくれるわけです。
詳しくは、
MSDN:Visual Basic の論理演算子とビット処理演算子
Microsoft サポートオンライン:Visual Basic での “ショートサーキット” 評価の説明
をご覧ください。
Note:非ショートサーキットを利用して条件判断の中で関数を呼び出して処理をさせる(状態変化させる)というワザもありますが、個人的にはあまりオススメできません。可読性とか保守性とかの点で問題ありかと思います。
#なんでイマサラこんなことを書いているかというと、プロジェクト内で派手目に嵌りかけていた人がいたもんで…

InteropForms ToolKit for VS2008

3/5 付けで、InteropForms TookKit for VS2008 の記事が VBTeam の blog に上がっていました(記事はコチラ)。
要点を斜め読みしてみると…
・VS2005 & 2008 対応よ、side by side よ。
・Channel9 にインタビューがあがってるから、ソレも見てね(コチラ
・わかんないこととか、フィードバックとかあったら、forumに書いてね。
・キーボードを使ってのホスト(.NET)とゲスト(VB6)の行き来に、ちょっとうまくいかない所があるよ。
・コントロール名にダブルバイトを使うとうまくいかないよ(直してるけど、まだFixしてないよ)。
まだイロイロと書いてあるわけなんですが、残念ながら根性を入れて訳すだけの時間がないので、とりあえずご紹介まで。
#最後の章の表題が「VB6 – Live long and prosper…」ってなってるのがニクイですね。

【コネタ】VS2008 + Linq のちょっとした罠

Visual Studio 2008 のいい所(の一つ)に、 「.NET Framework のバージョンを指定できる」というのがあります。
これのおかげで2.0相手でもVS2008で作業が出来、進化したインテリセンス等などの恩恵にあずかることが出来るわけです。
でもって、VS2008で良く出てくるキーワード「Linq」があります。
これを使おうと、

[VB.NET]
Imports System.Xml.L

と打っても、Linqが出てこないことがあります。
で、[My Project]から「参照」で追加しようとしても、選択できないのです。
System.Xml.Linqを参照設定しようとしてみても…
考えてみれば当たり前で、Linqは.NET Framework 3.5 の機能(上図参照)。ターゲットが3.0や2.0では利用できない訳です。
ま、世の中そんなに甘かぁねぇよなって話で。

VB Power Pack 3.0

Microsoft Visual Basic Power Packs 3.0 がリリースされたようです。詳細はコチラから。
今回の3.0での目玉は、「DataRepeater control」のようです。
データの繰り返しを簡単に表示できて、スクロールも出来て…ということのようです。(このあたりは、まだ詳しく調べていませんが…)
また、2.0までで存在した、Line and Shape, PrintForm, Printer 回りも含まれます。
なんかまるっきり「翻訳しただけ」状態ですが、まぁご紹介ということで。

Visual Studio 2008 のちょっとウレシイ機能

Visual Studio 2008 をインストールしてみて、最初に気づいた「ちょっとウレシイ機能」。Visual Studio 2005と同居インストールでのお話です。
・インテリセンスが進化した
インクリメンタルに絞り込んでくれるので、実にやりやすい。
と、いう話はイロイロな所で挙がっているのですが、私的に一番ウレシイのは、何と言ってもコレ!
・Visual Studio 2005 の設定を引き継ぐことが出来る
初回起動時にチェックボックスで「引き継ぐか?」と聞いてきます。デフォルトでonです。
で、起動してみると、なんと!画面色・フォントを引き継いでいます。色・フォントを変えまくっているワタクシとしては、実にうれしい機能です。(そのほかにも、スタートアップ時の設定も引き継げます。)
実に小さな点ですが、素直にウレシイ機能でした。

継承と&quot;Shadows&quot;

VBのキーワードで”Shadows”ってのがあります。
MSDN-Visual Basic言語リファレンス-Shadowsによれば、「継承された要素の再定義」ということだそうです。
じゃぁOverridesと何が違うの?というのは、MSDN-Visual Basic言語の概念-シャドウとオーバーライドの違いに説明されていますが、まぁ判りにくいモンです。
これらを解説しているページはイロイロあるので省略しますが、ちょっと注意しなければいけないのが、こういう状況の時です。
[基底クラス]
Public Sub DoSomething()
[派生クラス]
Private Shdows Sub DoSomething()
とあったとき、派生クラスのインスタンスからDoSomethingを呼べるのか?呼べるとするとどうなるのか?とう話です。
これが呼べるんです。
しかも、基底クラスの方が呼ばれてしまうんです。
ソースとしては、こんな感じになります。

[VB.NET]
‘—基底クラス
Public Class Base
  Public Sub DoSomething()
    Console.WriteLine(“Base.DoSomething”)
  End Sub
End Class
‘—派生クラス
Public Class InheritsClass
  Inherits Base
  Private Shadows Sub DoSomething()
    Console.WriteLine(“Inherits.DoSomething”)
  End Sub
End Class
‘—呼び出し元
Module Module1
  Sub Main()
    Dim objSome As InheritsClass = New InheritsClass
objSome.DoSomething()
    Console.WriteLine(“Hit any key…”)
    Console.ReadKey()
  End Sub
End Module

これはコンパイルエラーにならず、実行すると基底クラス側の”DoSomething”が呼び出され、”Base.DoSomething”が出力されます。
このあたりはちょっと注意が必要なポイントです。
(と、いうか、軽く痛い目にあったわけで。)

Vista 上の EventLog への出力に嵌る

Vista上で EventLog に出力しようとしていたわけです。
最初は何も考えずに

[VB.NET]
EventLog.WriteEntry(“”,strMessage)

なんてやったら、「Sourceを指定しろ!」と怒られまして。
そりゃそうだと、納得しながらSourceを指定してやってみます。
で、当然Sourceが無いことは知っていますので、Sourceを作成する必要があります。

[VB.NET]
If EventLog.SourceExists(strEventLogSource) = False Then
  EventLog.CreateEventSource(strEventLogSource, “”)
End If

とやってみました。CreateEventSource の第二引数を空文字にすると、デフォルト(つまり「アプリケーション」)です。
で、やってみると、SourceExists で SecurityException。メッセージを見てみると、「一部のイベントログを検索できませんでした-Security Log」みたいなことが書いてありまして。
いや、別にSecurity Logなんて見に行ってくれなくても良いのですが…
で、こんなコードを入れてみます。

[VB.NET]
Dim objPermission As System.Diagnostics.EventLogPermission = New System.Diagnostics.EventLogPermission(EventLogPermissionAccess.Write, “.”)
objPermission.PermitOnly()

コレでもダメ。
で、調べて行き着いたのが、コチラ:[MSDN Blog-松崎 剛 ブログ]-Windows Vista の新しい UAC の機能 (セキュリティ) でコードが例外を出す場合の対処について 【Part 2】
なるほど、管理者権限が必要なのですね。
と、いうわけで、(コンソールアプリケーションだったので)コマンドプロンプトを「管理者として」開いて、そこから実行してみると…
これまたエラー。権限が足りんと怒られました。しかし、場所は”WriteEntry”です。ちと違う場所になりました。
で、これは、「サポート技術情報:918122-BUG: .NET Framework 2.0 の EventLogPermissionAccess.Write アクセス レベルを使用すると、 EventLog.WriteEntry メソッドを呼び出すと、セキュリティ例外エラー メッセージを表示します。」にある状況と見たので、

[VB.NET]
Dim objPermission As System.Diagnostics.EventLogPermission = New System.Diagnostics.EventLogPermission(EventLogPermissionAccess.Administer, “.”)
objPermission.PermitOnly()

に変更した所、上手くいきました。
で、その後、通常のコマンドプロンプトでやってみたら、動きやがるわけです。
つまり、既にそのSourceが作成されていれば、こんな厄介なことにはならないと。
「キチンとインストーラーで配布しろ」ってことですかい?こりゃ面倒くさい…
或いは、常に管理者として実行させるように、プロパティやマニフェストで…これまた面倒くさい。
ま、これでイベントログに書き込めたわけですが、

ソース “HogeHoge” からのイベント ID 0 の説明が見つかりません。このイベントを発生させるコンポーネントがローカル コンピュータにインストールされていないか、インストールが壊れています。ローカル コンピュータにコンポーネントをインストールするか、コンポーネントを修復してください。

という、実に煩雑なメッセージがついてくることは昔から変わらず。
メッセージDLLを作ってレジストリに登録して…
たかだかイベントログ風情が生意気に…という気にすらなります。
が、とにかく、
Vista 上のイベントログに出力するのは、結構面倒くさい。
ということでした。