はじめに
今までは、IEツールバーを作成するためには、C++, ATL などといった知識が必要でした。.NETでは、そういった知識は必要なく、Pavel Zolnikov氏が作成したBandObjects
というフリーのクラスライブラリを利用することで、簡単にツールバーが作成できます。
ここでは、サンプルとして、C#でPerformanceCounter
を使ったLANの転送速度メーターを作成します。
必要な環境
- Visual C# 2003(Visual Studio.NET 2003)以降
- BandObjects
BandObjectsの入手・ビルド
CodeProjectの記事「Extending Explorer with Band Objects using .NET and Windows Forms」より、BandObjectsを入手します。ソースコードにて配布されているので、まずはBandObjectsをビルドします。「<解凍したフォルダ>\BandObjectsLib\」の中にソースがありますので、ソリューションを開き、ビルドをします。「BandObjectLib.dll」と「Interop.SHDocVw.dll」が作成されるはずです。
プロジェクトの作成
VS.NET(C#.NET)にて、新規プロジェクトを作成します。[ファイル]→[新規作成]→[プロジェクト...]を選択し、ダイアログで、[プロジェクトの種類]から[Visual C# プロジェクト]、[テンプレート]から[Windows コントロールライブラリ]を選択します。
ここでは、例として「czPerformBar」という名前のプロジェクトを作成します。作成したら、作成されたプロジェクトのディレクトリに、先ほどビルドした2ファイルと、「<解凍したフォルダ>\」にある「BandObjects.snk」ファイルをコピーします。
コピーの後、BandObjectLib
を、参照設定に加えます。ソリューションエクスプローラの[参照設定]を右クリックし、[参照の追加]を選びます。[参照]ボタンを押して、プロジェクトの中にある「BandObjectsLib.dll」を選択して、追加します。
コントロールの配置
次は、コントロールを配置します。例として、以下のように配置してみました(色などは自由で結構です)。
(Name) | Text | TextAlign |
label1 | 転送速度 | MiddleCenter |
label2 | Up | MiddleCenter |
label3 | Down | MiddleCenter |
lblTransUP | (Null) | MiddleCenter |
lblTransDOWN | (Null) | MiddleCenter |
コードの記述
以下のusing
文を追加します。
using BandObjectLib; using System.Diagnostics; using System.Threading; using System.Runtime.InteropServices;
次に、GUIDを作成します。[ツール]→[GUIDの作成]で作成できます。記述場所は、
namespace czPerformBar
のあとに追加します。
[Guid("4BED4CF4-038B-497b-AF65-D3F79E9056D9")]
GUIDを変更すると、「regasm」で同じ名前で登録しても、全く別のコントロールとして登録されてしまいます。GUIDは、一度設定したら、絶対に変えないようにしましょう。
GUIDを記述した下に、BandObjects
の動作を定義します。
[BandObject("czPerformBar", BandObjectStyle.Horizontal |
BandObjectStyle.ExplorerToolbar)]
BandObjects
の動作を定義する、BandObjectsStyle
には、以下の定数が含まれています。
定数 | 説明 |
BandObjectStyle.Horizontal | 水平方向にツールバーを配置します。 |
BandObjectStyle.Vertical | 垂直方向にツールバーを配置します。 |
BandObjectStyle.ExplorerToolbar | IE(エクスプローラ)のツールバーとして構成します。 |
BandObjectStyle.TaskbarToolbar | タスクバーのツールバーとして構成します。 |
次に、クラス名等を書き換えます。これを、
public class UserControl1 : System.Windows.Forms.UserControl { (略) }
以下のように変更します。クラスの名前は何でもいいですが、BandObject
を継承させるようにしてください。
public class czperformbar : BandObject { (略) }
同じく、関数も書き換えます。これを、
public UserControl1()
{
(略)
}
以下のように変更します。
public czperformbar()
{
(略)
}
いよいよ、コードを記述していきます。まず、クラスの部分から。
public class czperformbar :BandObject { // スレッドの待機時間(ms) int intInterval = 500; // 使用するネットワークカードの名前 string NICName = "Laneed LD-10_100AL PCI Fast Ethernet Adapter"; // 上り通信速度 PerformanceCounter TransUP = new PerformanceCounter("Network Interface", "Bytes Sent/sec","", "."); // 下り通信速度 PerformanceCounter TransDOWN = new PerformanceCounter("Network Interface", "Bytes Received/sec","", "." ); (以下略)
NICName
の値には、使用するネットワークカードの名前を入れてください。パフォーマンスカウンタの一覧に入っている名前です。一般的には、デバイスマネージャ に表示されているカード名(アダプタ名)でいいかと思います。
次に、PerformanceCounter
です。PerformanceCounter
は、指定されたパフォーマンスカウンタの値を取得します。上記の例で言うと、「Network Interface」は、カテゴリ名です。取得するパフォーマンスカウンタのカテゴリを指定します。カテゴリ名には他にも以下のようなものがあります。
- Processer
- TCP
- Cache
- ASP.NET
「Bytes Send/sec」は、カウンタ名です。上記のカテゴリに含まれる、オブジェクト名です。たとえば、「Network Interface」カテゴリの場合、以下のようなものがあります。
- Bytes Received/sec
- Bytes Send/sec
- Bytes Total/sec
- Packets Received/sec
- Packets Send/sec
- Packets Total/sec
3番目の引数の空文字「""
」は、インスタンス名です。ここでは、取得するインスタンスを設定します。ここで NICName
変数を直接指定してもいいですが、ここはあえて、別のところで指定します。
「"."
」は、コンピュータ名です。取得するコンピュータの名前を指定します。「"."
」だと、自分のPCのパフォーマンスカウンタを取得するようになります。
それでは、メインのコードを記述していきます。czperformbar
クラスのコンストラクタのInitializeComponent()
の後ろに以下のように記述してください。
//各パフォーマンスカウンタのオブジェクトに、 //インスタンス名としてネットワークカードの名前を割り当てます。 TransUP.InstanceName = NICName; TransDOWN.InstanceName = NICName;
また、データをリアルタイムに収集するため、スレッドを作成します。スレッドの本体関数から、作っていきましょう。クラス内に、新しい関数を作成します。「上り」の取得関数から。
private void trdgetNETSentBytePerSec() { float TransUPVal; while(true) { // Get Transfer(UP) //パフォーマンスカウンタの値の取得 TransUPVal = TransUP.NextValue(); //KByteに変換するため、1024で割る TransUPVal = TransUPVal / 1024; // ラベルに表示 lblTransUP.Text = TransUPVal.ToString("###0.00") + " KByte/sec"; this.Refresh(); System.Windows.Forms.Application.DoEvents(); Thread.Sleep(intInterval); // 時間待ち } }
次は「下り」です。
private void trdgetNETReceivedBytePerSec() { float TransDOWNVal; while(true) { // Get Transfer(DOWN) //パフォーマンスカウンタの値の取得 TransDOWNVal = TransDOWN.NextValue(); //KByteに変換するため、1024で割る TransDOWNVal = TransDOWNVal / 1024; // ラベルに表示 lblTransDOWN.Text = TransDOWNVal.ToString("###0.00") + " KByte/sec"; this.Refresh(); System.Windows.Forms.Application.DoEvents(); Thread.Sleep(intInterval); // 時間待ち } }
コード的には、ほとんど同じです。なんか、while (true)
ってやってて怖いですが。
次に、スレッドを動かすための記述です。先ほどの、
TransUP.InstanceName = NICName; TransDOWN.InstanceName = NICName;
の下に、以下のように記述します。
// 上り通信速度取得スレッド Thread TranUPThread = new Thread((new ThreadStart(this.trdgetNETSentBytePerSec))); TranUPThread.IsBackground=true; TranUPThread.Start(); // 下り通信速度取得スレッド Thread transDOWNThread = new Thread((new ThreadStart(this.trdgetNETReceivedBytePerSec))); transDOWNThread.IsBackground=true; transDOWNThread.Start();
これでコードのほとんどはできました。次は、「Assembly.cs」の編集です。まず、アセンブリの署名をします。
[assembly: AssemblyKeyFile(@"..\..\BandObjects.snk")]
キーファイル「BandObjects.snk」を使用して厳密名(Strong Key)で署名します。ファイルのパスは、環境に応じて変更してください。アセンブリのバージョンも、明確に決めます。
[assembly: AssemblyVersion("1.0.0.0")]
作成したツールバーをビルドする前に、先にBandObjectLib
を「regasm」と「gacutil」で登録する必要があります。そうでないと動きません(先にBandObjectLib
をソリューションごとビルドすれば自動的に登録されるはずです)。プロジェクトと同じ場所で、ビルドして出力されたファイルと一緒にBandObjectLib
を登録しても大丈夫かと思います。
ビルドします。ビルドエラーが出なければ、完成したも同然です。使用するには、作成したdllをアセンブリ等に登録してあげなければいけません。このためのプロジェクトも、作成しましょう。
ソリューションに、新しいプロジェクトを追加します。[ファイル]→[新規作成]→[プロジェクト...]を選択し、ダイアログで、[プロジェクトの種類]から[Visual C++ プロジェクト]、[テンプレート]から[空のプロジェクト (.NET)]を選択します。
追加したプロジェクトの構成プロパティの[全般]にある[構成の種類]を[ユーティリティ]にします。次に、今追加した「Register」プロジェクトのプロパティを開き、構成プロパティから、[ビルド イベント]→[ビルド後のイベント]を選択します。
[コマンドライン]の[...]をクリックし、表示された入力欄に以下のように入力します。
cd $(ProjectDir)..\..\bin\debug gacutil /if czPerformBar.dll regasm czPerformBar.dll
DLLのファイル名は、環境に応じて変えてください。「cd $(ProjectDir)..\..\bin\debug
」の所は、各自、環境に応じてパスを変更してください。ビルド順序を、「czPerformBar」が先、「Register」が後になるように変更してください。
これで、すべてビルド(ソリューションのビルド)して、IEをすべて閉じてIEを再起動。ツールバーの右クリックメニューに作成したツールバーが表示されていれば、完了です。動作としては、こんな感じになります。
また、VS 2005では「AssemblyInfo.cs」などの編集が簡単になり、プロジェクトのプロパティ画面で編集できます。
厳密名での署名は、プロジェクトのプロパティ中の[署名]タブで行います。
また、アセンブリのタイトルやバージョンは、[アプリケーション]タブの[アセンブリ情報]で設定できます。
gacutil /unregister "登録したファイル名" regasm /u "登録したファイル名"
なお、「gacutil」を使ってアンインストールするときは、ファイル名に拡張子は必要ありません。「regasm」のときは拡張子が必要です。
- ツールバーが固定になっていませんか?
- ネットワークカード名が間違っていませんか?
- パフォーマンスカウンタが無効になっている可能性があります。
PerformanceCounter
内のTcpip
がエラーを起こしてカウント取得が不可になってしまうので、上記KBを参照して、無効になっているパフォーマンスカウンタを有効にしてください。まとめ
BandObjects
を使うと、.NETで簡単にツールバーを作成することができました。この記事を参考にして、オリジナルのツールバーを作ってみてはいかがでしょうか。