VB8(VB2005)から追加された新しい機能の一つにMy名前空間があります。 この名前空間には、様々な機能を持ったクラスへのエイリアスが含まれていて、一つのメソッド呼び出しで簡単にそれらの機能にアクセスできるようになっています。 これらの機能はC#など.NET Frameworkの他の言語からも使用することができるようになっていますが、VBでは言語の機能として組み込まれているため非常に簡単に扱えるようになっています。

My名前空間という名称が与えられていますが、特殊な意味を持つ名前空間というよりは一種のユーティリティクラスといったものであるため、ソースコード内で論理的な構造を構成する名前空間の機能と混同しないようにしてください。 また、Myに類似したキーワードにインスタンス自身を参照するMeやMyBaseなどがありますが、これらも役割の異なるキーワードである点にも注意してください。

§1 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キーワードを使い、続けてComputerApplicationなど操作対象となるオブジェクトを参照してメソッドを呼び出します。 WAVEファイルの再生以外にも、My名前空間にはさまざまなカテゴリの機能が用意されています。

§1.1 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名前空間の機能はサポートされないので、この例のように機能に該当するクラスをインスタンス化してからメソッドを呼び出す必要があります。



§2 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
Windows 7での実行結果例
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名前空間のクラスを使わなくても簡単にファイル操作が行えるようなメソッドが多数用意されています。

§3 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
Windows 7での実行結果例
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の名前を取得できるようになっているので、OSPlatformOSVersionの組み合わせからOS名を判別するといった煩雑な処理を記述する必要はありません。

§4 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

§5 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を挟んで一定時間待機しています。

§6 その他の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
アプリケーション設定を保存したりするメソッドが提供されています