VB8(VB2005)から追加された新しい機能の一つにMy名前空間があります。 この名前空間には、様々な機能を持ったクラスへのエイリアスが含まれていて、一つのメソッド呼び出しで簡単にそれらの機能にアクセスできるようになっています。 これらの機能はC#など.NET Frameworkの他の言語からも使用することができるようになっていますが、VBでは言語の機能として組み込まれているため非常に簡単に扱えるようになっています。
My名前空間という名称が与えられていますが、特殊な意味を持つ名前空間というよりは一種のユーティリティクラスといったものであるため、ソースコード内で論理的な構造を構成する名前空間の機能と混同しないようにしてください。 また、My
に類似したキーワードにインスタンス自身を参照するMeやMyBaseなどがありますが、これらも役割の異なるキーワードである点にも注意してください。
My名前空間の機能の例
VB.NETでWAVEファイルを再生するにはSoundPlayerクラスやAPI関数のPlaySoundを使う方法がありますが、このほかにもMy名前空間のMy.Computer.Audio.Play
メソッドを使う方法があります。 このメソッドを使うとインスタンスの作成やAPI宣言などを記述することなくメソッド呼び出し1行でWAVEファイルの再生を行うことができます。
Imports System
Module Sample
Public Sub Main()
' E:\test.wavを再生し、再生が完了するまで待機する
My.Computer.Audio.Play("E:\test.wav", Microsoft.VisualBasic.AudioPlayMode.WaitToComplete)
End Sub
End Module
この例のように、今までなら多くのコードを書いたりAPIを使わなければ実現できなかった機能が、My名前空間のオブジェクトを使うことにより簡単に実現できるようになっています。 My名前空間の機能にアクセスするにはMy
キーワードを使い、続けてComputer
やApplication
など操作対象となるオブジェクトを参照してメソッドを呼び出します。 WAVEファイルの再生以外にも、My名前空間にはさまざまなカテゴリの機能が用意されています。
VB以外の言語とMy名前空間
C#などVB以外の言語からもMy名前空間の機能にアクセスすることはできます。 例えばC#でMy名前空間の機能を使ってWAVEファイルを再生する場合は次のようになります。
using System;
using Microsoft.VisualBasic.Devices;
class Sample {
static void Main()
{
// My.Computer.Audioに相当するインスタンスを作成する
Audio audio = new Audio();
audio.Play(@"E:\test.wav", Microsoft.VisualBasic.AudioPlayMode.WaitToComplete);
}
}
Microsoft.VisualBasic.dllを参照に追加することでMy名前空間の機能を使うことはできますが、C#にはmy
などのキーワードは用意されておらずMy名前空間の機能はサポートされないので、この例のように機能に該当するクラスをインスタンス化してからメソッドを呼び出す必要があります。
My.Computer.FileSystem
My.Computer.FileSystem
には、名前の通りファイルシステムに関する機能が存在します。 このうち、 SpecialDirectoriesプロパティには特殊フォルダのパスを簡単に取得できるメンバが用意されています。 CurrentDirectoryプロパティではカレントディレクトリを取得できます。
Imports System
Module Sample
Public Sub Main()
' 特殊なディレクトリのパス
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.AllUsersApplicationData)
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData)
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.Desktop)
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.Programs)
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.MyDocuments)
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.MyPictures)
Console.WriteLine(My.Computer.FileSystem.SpecialDirectories.Temp)
Console.WriteLine()
' カレントディレクトリのパス
Console.WriteLine(My.Computer.FileSystem.CurrentDirectory)
End Sub
End Module
C:\ProgramData\Sample\Sample\0.0.0.0 C:\Users\smdn\AppData\Roaming\Sample\Sample\0.0.0.0 C:\Users\smdn\Desktop C:\Users\smdn\AppData\Roaming\Microsoft\Windows\Start Menu\Programs C:\Users\smdn\Documents C:\Users\smdn\Pictures C:\Users\smdn\AppData\Local\Temp E:\test\
Drivesプロパティはシステムに存在する全てのドライブの情報を格納したDriveInfoクラスの読み取り専用コレクションになっています。 このコレクションを列挙して個々のDriveInfoを参照することにより、ドライブに関する情報、例えばファイルシステムや空き容量、ドライブの種類などを取得することができます。 このほかDriveInfoクラスの使い方についてはファイル・ディレクトリの操作 §.DriveInfoクラスで詳しく解説しています。
Imports System
Imports System.IO
Module Sample
Public Sub Main()
' システムに存在するすべてのドライブを列挙する
For Each drive As DriveInfo In My.Computer.FileSystem.Drives
' ドライブ名を表示
Console.Write("{0} - ", drive.Name)
' ドライブの準備ができているかどうか
If drive.IsReady Then
' ドライブの種類・フォーマット・総容量を表示する
Console.Write("{0}({1}), ", drive.DriveType, drive.DriveFormat)
Console.Write("Total {0:N0} Bytes", drive.TotalSize)
Else
Console.Write("(ドライブの準備ができていません)")
End If
Console.WriteLine()
Next
End Sub
End Module
A:\ - (ドライブの準備ができていません) C:\ - Fixed(NTFS), Total 80,024,170,496 Bytes D:\ - Fixed(NTFS), Total 1,000,202,039,296 Bytes E:\ - Fixed(NTFS), Total 81,961,938,944 Bytes F:\ - (ドライブの準備ができていません) L:\ - Network(NTFS), Total 147,640,692,736 Bytes M:\ - Network(NTFS), Total 499,962,740,736 Bytes
なお、System.IO.DriveInfo.GetDrivesメソッドを呼び出すことでもMy.Computer.FileSystem.Drivesプロパティと同じくすべてのドライブのDriveInfoを取得することができます。
このほかにも、My.Computer.FileSystem
にはファイルシステムに関する様々なメソッドが用意されています。 そのうちのいくつかを抜粋します。 いずれも名前から機能と動作が容易に想像できるようになっています。
- ドライブ関連
- My.Computer.FileSystem.GetDriveInfo()
- ディレクトリ関連
- My.Computer.FileSystem.CreateDirectory()
- My.Computer.FileSystem.CopyDirectory()
- My.Computer.FileSystem.CreateDirectory()
- My.Computer.FileSystem.DeleteDirectory()
- My.Computer.FileSystem.DirectoryExists()
- My.Computer.FileSystem.GetDirectories()
- My.Computer.FileSystem.GetDirectoryInfo()
- My.Computer.FileSystem.MoveDirectory()
- My.Computer.FileSystem.RenameDirectory()
- ファイル関連
- My.Computer.FileSystem.CopyFile()
- My.Computer.FileSystem.DeleteFile()
- My.Computer.FileSystem.FileExists()
- My.Computer.FileSystem.GetFileInfo()
- My.Computer.FileSystem.GetFiles()
- My.Computer.FileSystem.MoveFile()
- My.Computer.FileSystem.RenameFile()
- ファイルIO関連
- My.Computer.FileSystem.OpenTextFieldParser()
- My.Computer.FileSystem.OpenTextFileReader()
- My.Computer.FileSystem.OpenTextFileWriter()
- My.Computer.FileSystem.ReadAllBytes()
- My.Computer.FileSystem.ReadAllText()
- My.Computer.FileSystem.WriteAllBytes()
- My.Computer.FileSystem.WriteAllText()
- パス関連
- My.Computer.FileSystem.CombinePath()
- My.Computer.FileSystem.GetParentPath()
- My.Computer.FileSystem.GetRelativePath()
このように、System.IO名前空間のクラスを使わなくても簡単にファイル操作が行えるようなメソッドが多数用意されています。
My.Computer.Info
My.Computer.Info
からは現在アプリケーションを実行しているマシンに関する情報を取得することが出来ます。 取得できるのはOSに関する情報、使用可能メモリなどです。
Imports System
Module Sample
Public Sub Main()
' OS情報
Console.WriteLine("OS: {0}", My.Computer.Info.OSFullName)
Console.WriteLine("{0} {1}", My.Computer.Info.OSPlatform, My.Computer.Info.OSVersion)
Console.WriteLine()
' 使用可能メモリ
Console.WriteLine("PhysicalMemory: {0:N0}/{1:N0}", My.Computer.Info.AvailablePhysicalMemory, My.Computer.Info.TotalPhysicalMemory)
Console.WriteLine("VirtualMemory: {0:N0}/{1:N0}", My.Computer.Info.AvailableVirtualMemory, My.Computer.Info.TotalVirtualMemory)
Console.WriteLine()
End Sub
End Module
OS: Microsoft Windows 7 Ultimate Win32NT 6.1.7601.65536 PhysicalMemory: 2,525,061,120/4,294,500,352 VirtualMemory: 8,795,564,412,928/8,796,092,891,136
My.Computer.Info.OSFullName
でOSの名前を取得できるようになっているので、OSPlatform
とOSVersion
の組み合わせからOS名を判別するといった煩雑な処理を記述する必要はありません。
My.Computer.Clock
My.Computer.Clock
からは時刻に関する情報を取得することが出来ます。
Imports System
Module Sample
Public Sub Main()
Console.WriteLine("TickCount: {0} / {1}", My.Computer.Clock.TickCount, Environment.TickCount)
Console.WriteLine("GmtTime: {0} / {1}", My.Computer.Clock.GmtTime, DateTime.UtcNow)
Console.WriteLine("LocalTime: {0} / {1}", My.Computer.Clock.LocalTime, DateTime.Now)
End Sub
End Module
TickCount: 712609 / 712609 GmtTime: 2013/12/26 15:07:10 / 2013/12/26 15:07:10 LocalTime: 2013/12/27 0:07:10 / 2013/12/27 0:07:10
My.Computer.Audio
My.Computer.Audio
にはWAVEファイルを再生する機能が用意されています。 My.Computer.Audio
でサポートされるオーディオファイルはWAVE形式のみです。
Imports System
Imports System.IO
Imports System.Threading
Module Sample
Public Sub Main()
' MP3などWAVE以外のフォーマットはサポートされない
'My.Computer.Audio.Play("E:\Test.mp3", AudioPlayMode.WaitToComplete)
' Streamから再生
Using stream As New FileStream("E:\test1.wav", FileMode.Open, FileAccess.Read)
' WaitToComplete: 再生が完了するまで待機する
' Background : バックグラウンドで再生する
' BackgroundLoop: バックグラウンドでループ再生する
My.Computer.Audio.Play(stream, AudioPlayMode.WaitToComplete)
End Using
' バックグラウンドで音声を再生する
' 再生が終了したら先頭から繰り返し再生する
My.Computer.Audio.Play("D:\test2.wav", AudioPlayMode.BackgroundLoop)
' 500ミリ秒待機
Thread.Sleep(500)
' バックグラウンドで再生中の音声を止める
My.Computer.Audio.Stop()
End Sub
End Module
このほかにも、Byte型配列を引数にとるバージョンのPlayメソッドもあるので、プログラム中で動的にWAVEを作成して再生する、といったことにも使えます。
また、自分で用意したWAVEファイルではなくシステム標準の効果音を鳴らす場合には、PlaySystemSoundメソッドを使用します。 なお、PlaySystemSoundメソッドの引数で指定するSystemSounds列挙型はSystem.Media名前空間に含まれます。
Imports System
Imports System.Media
Imports System.Threading
Module Sample
Public Sub Main()
My.Computer.Audio.PlaySystemSound(SystemSounds.Asterisk)
Thread.Sleep(1000)
My.Computer.Audio.PlaySystemSound(SystemSounds.Beep)
Thread.Sleep(1000)
My.Computer.Audio.PlaySystemSound(SystemSounds.Exclamation)
Thread.Sleep(1000)
My.Computer.Audio.PlaySystemSound(SystemSounds.Hand)
Thread.Sleep(1000)
My.Computer.Audio.PlaySystemSound(SystemSounds.Question)
Thread.Sleep(1000)
End Sub
End Module
PlaySystemSoundメソッドはPlayメソッドのように同期的に再生することができないため、この例では途中にThread.Sleepを挟んで一定時間待機しています。
その他のMy名前空間のオブジェクト
ここで紹介した以外にも、My名前空間には様々なオブジェクトが用意されています。 ここではそのうちよく使われそうなものをいくつか紹介します。
- My.Application
- 実行しているアプリケーションに関する情報を取得したりできます
また、DoEvents, RunなどのメソッドやStartup, Shutdownといったイベントも提供されています - My.Application.Info
- アプリケーションのバージョン情報や製品名などのアセンブリ情報、スタックトレースなどを取得できます
- My.Application.Log
- ログの書き込みなどを行うメソッドが提供されています
- My.Computer.Clipboard
- クリップボードに対する操作を行うメソッドが提供されています
- My.Computer.Network
- ネットワーク関連のプロパティや、アップロード・ダウンロードを行うメソッドが提供されています
- My.Computer.Registry
- レジストリを操作するためのメソッドが提供されています
- My.Settings
- アプリケーション設定を保存したりするメソッドが提供されています