Visual Studio で VB.NET のアプリを F5 で開始すると、出力ウィンドウ(またはイミディエイトウィンドウ)に下記のメッセージが出た。
例外がスローされました: ‘System.MissingMemberException’ (Microsoft.VisualBasic.dll の中)
エラーの意味は「存在しない、または public として宣言されていないクラスメンバーに動的にアクセスしようとした」ということ(Microsoft Docs より引用)。
実は、このメッセージはかなり以前から出ていたんだけど、アプリの動作に問題が無かったのであまり気にしてなかった。
それに「Microsoft.VisualBasic.dll の中」で発生している例外エラーということは Microsoft.VisualBasic.dll のソースコードの問題だと解釈していたので、「自分が書いたコードのせいではない」「直しようがない」と思っていた。
しかしその解釈は間違っていたらしい(少なくとも今回の場合は)。(今回は)どうやら Microsoft.VisualBasic.dll の外に書かれているコードのせいで例外が発生しているようだ。
というわけで該当箇所を探し始めると間もなく発見。
冒頭のエラーメッセージの原因はこんなコードだった。
Dim name As String = "" Try name = ctrl.Name 'TypeOf ctrl Is Object Catch ex As Exception End Try
ctrl の型は Object 型。
ctrl に .Name プロパティが含まれているかどうか分からないので Try ~ Catch で例外エラーを補足してアプリケーションが止まらないようにしているコードだった。
従ってアプリケーションの動作自体に問題は無かったものの、実際はここで例外が発生したときに出力ウィンドウ(またはイミディエイトウィンドウ)にそのメッセージが出ていたのだと分かった。
前述のコードをそのまま放っておいても実害はないが、もう少しスマートなやり方があると分かったので下記のように修正しておいた。
If ctrl.GetType.GetProperty("Name") IsNot Nothing Then name = ctrl.Name End If
これで冒頭のエラーメッセージが出なくなってスッキリ!