.NET Framework 2.0以降ではWAVE形式の音声の再生にSoundPlayerクラスまたはSystemSoundsクラスを用いることができる。 WAVEファイルから読み込んで再生する場合はSoundPlayerクラスを用いる。 システム音を再生する場合はSystemSoundsクラスを用いる。

SoundPlayerクラスによるWAVE音声の読み込み・再生
using System;
using System.Media;
using System.Threading;

class Sample {
  static void Main()
  {
    using (var sound = new SoundPlayer()) {
      // 読み込むWAVEファイルを指定
      sound.SoundLocation = "test.wav";

      // ファイルを非同期的に読み込む
      sound.LoadAsync();

      // 読み込みが完了するまで待つ
      while (!sound.IsLoadCompleted) {
        Thread.Sleep(100);

        Console.WriteLine("loading...");
      }

      // 非同期的に再生
      sound.Play();

      // 再生を開始したら、3秒間待機
      Console.WriteLine("playing...");

      Thread.Sleep(3000);

      // 再生を停止
      sound.Stop();
    }
  }
}

なお、.NET Framework 1.xにはWAVEファイルの再生に関するクラスがないので、API関数のPlaySoundを用いる必要がある。 PlaySound関数はファイルから直接再生するバージョンと、メモリ上にあるバッファから再生するバージョンがある。 何度も再生されるような音声は、バッファを作成した方が効率的。

PlaySound関数を使ったWAVE音声の再生
// ファイルから再生する
[DllImport( "winmm.dll", EntryPoint = "PlaySound" )]
private static extern int PlaySound(
    [MarshalAs(UnmanagedType.LPStr)] string pszSound,
    int hModule,
    int dwFlags );

// メモリ上のバッファから再生する
[DllImport( "winmm.dll", EntryPoint = "PlaySound" )]
private static extern int PlaySound(
    [MarshalAs(UnmanagedType.LPArray)] byte[] pszSound,
    int hModule,
    int dwFlags );

// 再生フラグ
private const int SND_SYNC   = 0x0;    // 同期再生
private const int SND_ASYNC  = 0x1;    // 非同期再生
private const int SND_MEMORY = 0x4;    // バッファからの再生
private const int SND_LOOP   = 0x8;    // ループ再生
private const int SND_NOSTOP = 0x10;   // 再生中のサウンドを停止しない
private const int SND_NOWAIT = 0x2000; // ビジー状態なら即座に処理を返す

// バッファ
byte[] buffer;

private void Form1_Load( System.Object sender, System.EventArgs e )
{
    // ファイルからバイト配列に読み込み
    FileStream stream;
    BinaryReader reader;

    stream = new FileStream( @"E:\Test.wav", FileMode.Open, FileAccess.Read );

    reader = new BinaryReader( stream );

    buffer = reader.ReadBytes( (int)stream.Length );

    reader.Close();

    stream.Close();
}

private void Form1_Closed( object sender, System.EventArgs e )
{
    buffer = null;
}

private void Button1_Click( System.Object sender, System.EventArgs e )
{
    // ファイルから再生
    PlaySound( @"E:\Test.wav", 0, SND_ASYNC );
}

private void Button2_Click( System.Object sender, System.EventArgs e )
{
    // バッファから再生
    PlaySound( buffer, 0, SND_MEMORY | SND_ASYNC );
}