スポンサーリンク

2015年4月24日金曜日

VB.NET で構造体に FieldInfo クラスを使用して値を設定する方法

 リフレクションを使ったオブジェクトに対する値の取得や設定で使用する PropertyInfo クラスや FieldInfo クラス。
 構造体は値型だけど、C# の場合は object 型に一度ボックス化して参照型に変換することで解決できる。

 だがしかし。

 VB.NET の場合は上手くいかない。内部でボックス化されたものが値型か参照型かを判定して処理しているため、結局ボックス化が無意味になっていまっている。

 じゃあ、VB.NET ではリフレクションを使って構造体に値を設定できないのか……。

 と、いろいろ調べてみたところ、ValueType クラスを経由することで解決できる模様。

Dim s As New S
Dim v As ValueType = s
Dim f As FiledInfo = s.GetType().GetField("Name")

f.SetValue(v, "Hoge2")

s = DirectCast(v, S)

 うん、やっぱり VB は好きになれない。

VMWare Toolsのインストールでブルースクリーン

 VMWare Player または VMWare Workstation にホスト OS として Windows Server 2003 を使用し、VMWare Tools をインストールすると途中でエラーが発生してブルースクリーンに切り替わることがある。(自分の環境でしか試していない)
 いろいろ試行錯誤した結果、VMWare Tools によってインストールされる VMCI のインストールでこける模様。
 VMCI は、ある仮想 OS とホスト OS 上のアプリケーションの通信、または、同一ホスト上における仮想 OS 間の通信の性能向上を実現するためのインターフェース。  詳細は公式ドキュメントを参照。

VMCI Overview

 ちなみにこれをインストールすると起動時にもエラーが発生してログインできなくなったりする。
 また、VMWare Tools のインストール途中で再起動がかかるためか、マウスカーソルが表示されなくなったりする場合もある。
 エラー自体はレジストリの NetworkProvider の参照順の設定から vmhgfs を削除すれば消える。が、マウスカーソルが表示されるようになったりはしない。

 対処としては、VMWare Tools のインストールでカスタムを選択肢、VMCI をインストール対象から除外すればよい。

 VMCI ライブラリを使用してアプリケーションを組むことってそうそうないだろうけど、必要になったときにどうするか。
 今回は Windows Server 2003 だったのでもっと新しいバージョンでは発生しないのかなぁ。