2012-07-10T23:38:50の更新内容

programming/netfx/embeddedresource/index.wiki.txt

current previous
1,194 1,218
~
${smdncms:title,リソースの埋め込みと読み込み}
${smdncms:title,アセンブリへのリソースの埋め込みと読み込み}
~
${smdncms:keywords,実行可能ファイル,アセンブリ,リソース,埋め込み,埋め込まれたリソース,読み込み,GetManifestResourceStream}
${smdncms:keywords,VB,VB.NET,アセンブリ,リソース,埋め込み,埋め込まれたリソース,GetManifestResourceStream}
~

          
${smdncms:tags,api/.net,lang/vb}
~
.NET Frameworkでは、実行可能ファイル・アセンブリにビットマップやアイコンなどの画像ファイル、マルチメディアファイル、テキストファイルなどをリソースとして埋め込むことができます。 これによって単体で存在する外部ファイルを実行可能ファイルやアセンブリに含めてひとまとめにすることができます。 ここではリソースを埋め込むための方法と、埋め込んだリソースの読み込み方法について解説します。
${smdncms:meta,toc-amazonlivelink-keyword,books-jp,.net framework}
-
VBやVC++では、アプリケーションが使用するビットマップやアイコンなどのイメージ、マルチメディアファイル、テキストなどのいくつかのファイルをリソースとして実行可能ファイルに埋め込むことができます。 これによって外部ファイルとしてそれぞれ単体で存在するものを実行可能ファイルとしてひとまとめにすることができます。 Visual Studio .NETでもリソースを実行可能ファイルに埋め込むことができます。 その方法を順を追って見てみます。
 

        

        
 
-関連するページ
-関連するページ
 
--[[programming/netfx/classlibrary]]
--[[programming/netfx/classlibrary]]
-
--[[programming/tips/get_assembly_version_info]]
 
--[[programming/tips/plugin_assembly]]
--[[programming/tips/plugin_assembly]]
-
--[[programming/tips/playsound_wave]]
 

        

        
 
#googleadunit
#googleadunit
 

        

        
~
*Visual Studioでのリソースの埋め込みと読み込み
*アセンブリへのリソースの埋め込み
~
ここではVisual Studio 2008を使った場合を例としてリソースの埋め込みと読み込みの方法を見ていきます。 なお、2008以外の他のバージョンでもメニュー等が若干異なる程度で基本的な手順は同じです。
**リソースを用意する(新しく作成する)
-
リソースを埋め込むにはリソースとなるファイルが存在している必要があります。 あらかじめ用意しておくこともできますし、数種のリソースはVisual Studio .NETで作成することもできます。 新しくリソースを作成するには、ソリューションエクスプローラでプロジェクトを右クリックして「追加」メニューの「新しい項目の追加」をクリックします。
-
#ref(0.jpg,新しい項目の追加)
-

          
-
現れたダイアログの中から追加したい項目を選び、適当なファイル名を与えてやります。 ここではアイコンを選択し、「ApplicationIcon.ico」と名付けることにします。 種類とファイル名を決めたら、「開く」ボタンを押します。
-
#ref(1.jpg,リソースの種類を選択)
-

          
-
リソースがプロジェクトに追加されるので、あとは生成されたリソースを編集します。
-
#ref(2.jpg,プロジェクトに追加されたリソース)
-

          
-
**リソースを用意する(既存のものを利用する)
-
Visual Studio .NETのアイコンエディタなどは非常に使いにくいので、画像などのリソースはフォトショップなど専門のアプリケーションを用いて編集し、完成したものをリソースとして埋め込むことが多いと思います。 既存のリソースはリソースの新規作成と同様の方法で、「追加」メニューの「既存項目の追加」をクリックします。
-
#ref(3.jpg,既存項目の追加)
-

          
-
現れたダイアログの中から目的のファイルを選択します。 選択したら「開く」ボタンを押します。
-
#ref(4.jpg,追加する項目を選択)
-

          
-
これで目的のファイルがプロジェクトに追加されました。
-
#ref(5.jpg,リソースを追加した後の構成)
-

          
-
**リソースのプロパティを変更する
-
このままだとただのプロジェクトファイルなので、プロパティを変更してビルド時にアセンブリに埋め込まれるようにします。 埋め込みたいファイルを選択し、プロパティページで「ビルド アクション」を「埋め込まれたリソース」に変更します。
-
#ref(6.jpg,プロパティを変更)
 

        

        
~
**リソースファイルの追加 (新しく作成する)
*埋め込まれたリソースの読み込み
~
まずは、リソースを新しく作成して埋め込む方法です。 新しくリソースを作成するには、ソリューションエクスプローラでプロジェクトを右クリックして[追加]メニューの[新しい項目の追加]をクリックします。
アセンブリに埋め込まれたリソースを実行時に読み込むには、大まかに次の手順を踏みます。
~
#image(vs2008-00-newfile-0.png,60%,新しい項目の追加)
+Reflection.Assembly.GetExecutingAssembly()メソッドにより現在実行中のアセンブリを取得する。
~

          
+取得できたアセンブリに対してGetManifestResourceStream()を呼び出し、指定したリソースに対するストリームを取得する。
~
続いて、追加したいリソースの種類とファイル名を設定します。 ここではビットマップファイルを追加することにします。 ファイル名は後で変更することもできるので、デフォルトのままでも構いません。 種類とファイル名を決定したら[追加]をクリックします。
+取得できたストリームから必要なデータを読み込む。
~
#image(vs2008-00-newfile-1.png,60%,追加するリソースの種類とファイル名)

          
~

          
次のコードではこの手順により先ほど埋め込んだリソースを読み込んでいます。 この例ではSample.txtというテキストファイルもリソースとして埋め込んでいます。
~
すると、リソースがプロジェクトに追加されます。 あとは、生成されたリソースを編集します。

          
~
#image(vs2008-00-newfile-2.png,60%,追加するリソースの種類とファイル名)
#code(,Sample.txtの内容){{
~

          
Sample.txt
~
**リソースファイルの追加 (既存のファイルを使う)
これはリソースとして埋め込まれたテキストファイルです。
~
Visual Studioで用意されている画像・アイコンエディタなどはあまり使い勝手が良くないため、画像などのリソースは外部のアプリケーションを用いて編集することになると思います。 そういった場合には、別のアプリケーションで作成したファイルをプロジェクトに追加することでリソースとして埋め込みます。 既存のファイルを埋め込む場合は、リソースを新規作成する場合と同じように[追加]メニューを開き、[既存の項目]をクリックします。
テキストも当然読み込むことができます。
+
#image(vs2008-00-addfile-0.png,60%,既存の項目の追加)
+

          
+
続いて、追加したいリソースとなるファイルを選択します。 このダイアログではどのようなファイルも追加することができますが、ファイルがプロジェクトのフォルダ外にある場合などは、ファイルをプロジェクトフォルダにコピーして追加するか、コピーはせず元のファイルへリンクするかを選択することが出来ます。 リソースファイルの管理方法に応じて適切なものを選んでください。
+
#image(vs2008-00-addfile-1.png,60%,追加するファイルの選択)
+

          
+
[追加]ボタンをクリックするとファイルがプロジェクトに追加されます。
+
#image(vs2008-00-addfile-2.png,プロジェクトに追加されたファイル)
+

          
+
**ファイルを埋め込みリソースとして設定する
+
上記の手順で追加したファイルをリソースとして埋め込むためには、ファイルのプロパティを忘れずに変更しておく必要があります。 ファイルを右クリックして[プロパティ]を開き、「ビルドアクション」が「埋め込まれたリソース」になっていることを確認します。
+
#image(vs2008-01.png,ビルドアクション)
+

          
+
このようにして埋め込みリソースとして追加されたファイルは、ビルド時に実行可能ファイル(アセンブリ)に埋め込まれることになります。
+

          
+
**リソースの読み込み [#Assembly.GetManifestResourceStream]
+
続いて埋め込まれたリソースを実行時に読み込む方法について見ていきます。 リソースを実行時に読み込むには、&msdn(netfx,member,System.Reflection.Assembly.GetManifestResourceStream){Assembly.GetManifestResourceStreamメソッド};を使います。 このメソッドは、埋め込まれたリソースを&msdn(netfx,type,System.IO.Stream){Stream};として取得するためのメソッドです。
+

          
+
より具体的には、以下の手順でリソースを読み込むことになります。
+
+&msdn(netfx,member,System.Reflection.Assembly.GetExecutingAssembly){Assembly.GetExecutingAssembly};等のメソッドを使い目的のリソースが埋め込まれているアセンブリを取得する
+
+取得したアセンブリに対して、目的のリソース名を指定してAssembly.GetManifestResourceStream()を呼び出し、リソースのストリームを取得する
+
+取得できたストリームからデータを読み込む
+

          
+
では早速、ここまでの手順で埋め込んだリソースを読み込んでみます。 以下の例では、リソースとして埋め込まれている画像ファイル"sample.bmp"を読み込み、ウィンドウの中央に表示しています。
+

          
+
#tabpage(C#)
+
#code(cs,Form1.cs){{
+
using System;
+
using System.Drawing;
+
using System.IO;
+
using System.Reflection;
+
using System.Windows.Forms;
+

          
+
namespace Sample {
+
  public partial class Form1 : Form {
+
    public Form1()
+
    {
+
      InitializeComponent();
+
    }
+

          
+
    private void Form1_Load(object sender, EventArgs e)
+
    {
+
      // 現在実行中のアセンブリを取得
+
      var assm = Assembly.GetExecutingAssembly();
+

          
+
      // リソースとして埋め込んだ画像ファイルのストリームを取得
+
      using (var stream = assm.GetManifestResourceStream("Sample.sample.bmp")) {
+
        // ストリームの内容をMemoryStreamにコピー
+
        var length = (int)stream.Length;
+
        var reader = new BinaryReader(stream);
+
        var memoryStream = new MemoryStream(length);
+

          
+
        memoryStream.Write(reader.ReadBytes(length), 0, length);
+

          
+
        // コピーしたMemoryStreamからBitmapを作成し、背景に設定
+
        this.BackgroundImage = Bitmap.FromStream(memoryStream);
+
        this.BackgroundImageLayout = ImageLayout.Center;
+
      }
+
    }
+
  }
+
}
 
}}
}}
~
#tabpage(VB)

          
~
#code(vb,Form1.vb){{
#code(vb){{
~
Imports System
Option Strict On
+
Imports System.IO
+
Imports System.Drawing
+
Imports System.Reflection
+
Imports System.Windows.Forms
 

        

        
 
Public Class Form1
Public Class Form1
~
  Private Sub Form1_Load( ByVal sender As System.Object,  ByVal e As System.EventArgs) Handles MyBase.Load
    Inherits System.Windows.Forms.Form
~
    ' 現在実行中のアセンブリを取得

          
~
    Dim assm As Assembly = Assembly.GetExecutingAssembly()
#Region " Windows フォーム デザイナで生成されたコード "
~

          
#End Region
~
    ' リソースとして埋め込んだ画像ファイルのストリームを取得

          
~
    Using stream As Stream = assm.GetManifestResourceStream("Sample.sample.bmp")
    ' アイコン
~
      ' ストリームの内容をMemoryStreamにコピー
    Dim ico As Drawing.Icon
~
      Dim length As Integer = CInt(stream.Length)

          
~
      Dim reader As New BinaryReader(stream)
    ' 画像
~
      Dim memoryStream As New MemoryStream(length)
    Dim img As Drawing.Image
~

          

          
~
      memoryStream.Write(reader.ReadBytes(length), 0, length)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
~

          

          
~
      ' コピーしたMemoryStreamからBitmapを作成し、背景に設定
        ' 現在実行中のアセンブリを取得
~
      Me.BackgroundImage = Bitmap.FromStream(memoryStream)
        Dim assm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()
~
      Me.BackgroundImageLayout = ImageLayout.Center

          
~
    End Using
        ' リソースを読み込むためのストリームを宣言
~
  End Sub
        Dim stream As IO.Stream
-

          
-

          
-

          
-
        ' アイコンのリソースのストリームを取得
-
        stream = assm.GetManifestResourceStream("ResourceAndMultimedia.ApplicationIcon.ico")
-

          
-
        ' ストリームを引数として取るコンストラクタを使用
-
        ico = New Drawing.Icon(stream)
-

          
-
        ' ストリームをクローズ
-
        stream.Close()
-

          
-
        ' 取得したアイコンをフォームのアイコンとして指定
-
        Me.Icon = ico
-

          
-

          
-

          
-
        ' イメージのリソースのストリームを取得
-
        stream = assm.GetManifestResourceStream("ResourceAndMultimedia.Sample.jpg")
-

          
-
        ' ストリームを引数として取るコンストラクタを使用
-
        img = New Drawing.Bitmap(stream)
-

          
-
        ' ストリームをクローズ
-
        stream.Close()
-

          
-

          
-

          
-
        ' テキストのリソースのストリームを取得
-
        stream = assm.GetManifestResourceStream("ResourceAndMultimedia.Sample.txt")
-

          
-
        ' リソースのストリームからStreamReaderオブジェクトを作成
-
        Dim reader As New IO.StreamReader(stream, System.Text.Encoding.GetEncoding(932))
-

          
-
        TextBox1.Text = ""
-

          
-
        ' 一行ずつ読み込み
-
        While (reader.Peek <> -1)
-

          
-
            TextBox1.Text += reader.ReadLine() + vbNewLine
-

          
-
        End While
-

          
-
        ' ストリームをクローズ
-
        reader.Close()
-

          
-
    End Sub
-

          
-

          
-
    Private Sub Form1_Paint(ByVal sender As System.Object, _
-
                 ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
-

          
-
        e.Graphics.Clear(Control.DefaultBackColor)
-

          
-
        ' フォーム上に画像を描画
-
        e.Graphics.DrawImage(img, 0, 0)
-

          
-
    End Sub
-

          
 
End Class
End Class
 
}}
}}
+
#tabpage-end
 

        

        
~
#image(vs2008-02.png,60%,実行結果)
#ref(7.jpg,実行結果)
 

        

        
~
GetManifestResourceStreamメソッドでリソースのストリームを取得する際に使用するリソース名は、「&var{プロジェクト名};.&var{ファイル名};」となります。 この例ではプロジェクト名が"Sample"、リソースのファイル名が"sample.bmp"なので、このリソースを参照する場合のリソース名は"Sample.sample.bmp"となります。 なお、このメソッドは指定するリソース名の大文字小文字の違いを意識する点に注意が必要です。 大文字小文字の違い含めてリソース名が一致しない場合は、見つからないものとして扱われます。
GetManifestResourceStream()メソッドでリソースのストリームを取得する際には、目的のリソースの名前を指定する必要があります。 その名前は「プロジェクト名.ファイル名」となります。 この例ではプロジェクト名が「ResourcesAndMultimedia」なので、たとえば「Sample.jpg」というファイル名のリソースを参照したい場合は「ResourcesAndMultimedia.Sample.jpg」となります。 ちなみに、このメソッドで目的のリソースが発見できなかった場合、Nothingが返されます。
-
#ref(8.png,リソースが発見できなかった場合)
 

        

        
~
またこのメソッドでは、指定された名前のリソースが見つからない場合null/Nothingが返されます。 リソースが見つからなくても例外がスローされることはありません。
それ以外のソースコードについても、ほとんど問題ないと思います。 BitmapおよびIconクラスはStreamオブジェクトを利用してインスタンスを作成するためのコンストラクタが用意されているため、これに取得できたストリームを渡すだけでイメージのインスタンスを作成することができます。 また、取得できたストリームを元にしてStreamReaderクラスなどのオブジェクトを作成することもできます。 テキストファイルのリソースの読み込みは、この方法を用いて一行ずつ読み込んでいます。
 

        

        
~
#image(vs2008-03.png,60%,リソースが見つからない場合)
これを実行した結果が上の図です。 小さくて見づらいですが、アイコンもちゃんと変わっています。 下の図はタスクバーの部分を拡大したものです。
-
#ref(9.jpg,タスクバー上のアイコン)
 

        

        
~
なお、このサンプルではリソースのストリームを&msdn(netfx,type,System.IO.MemoryStream){MemoryStream};にコピーしてからBitmapのインスタンスを作成しています。 これは、Bitmapを作成したあとにGetManifestResourceStream()で取得したストリームを閉じてしまうと例外がスローされるためです。 GetManifestResourceStream()で取得したストリームから直接画像を作成する場合は、ストリームを閉じないようにする必要があります。
*Waveファイルの埋め込み・読み込み・再生
-
リソースをイメージやテキストなどの限定的なオブジェクトとしてではなく、ストリームとして取得できることから、様々な操作を行うことができます。 リソースとしてWaveを埋め込み、独自のアプリケーションの警告音として使用したい場合などにも今まで紹介してきた方法と同じ方法が利用できます。 次のコードでは、アセンブリにSample.wavというファイルを埋め込んでおき、実行時にそれをバイト配列にバッファとして読み込み、ボタンが押された時点でそれを鳴らすということをしています。
 

        

        
~
ここではリソースから画像を読み込む方法を紹介しましたが、テキストファイルや音声ファイルなども同様に読み込むことが出来ます。 テキストファイルなら開いた&msdn(netfx,type,System.IO.StreamReader){StreamReader};など、音声ファイルなら&msdn(netfx,type,System.Media.SoundPlayer){SoundPlayer};などと組み合わせて使うことで読み込むことが出来ます。 (関連: [[programming/tips/playsound_wave]])
#code(vb){{
-
Option Strict On
 

        

        
~
また、この例では実行可能ファイルに含まれているリソースを取得しましたが、&msdn(netfx,member,System.Reflection.Assembly.Load){Assembly.Loadメソッド};や&msdn(netfx,member,System.Reflection.Assembly.GetAssembly){Assembly.GetAssemblyメソッド};などを使うことでDLLのアセンブリからリソースを取得するようにすることも出来ます。
Public Class Form1
-
    Inherits System.Windows.Forms.Form
 

        

        
-
#Region " Windows フォーム デザイナで生成されたコード "
-
#End Region
 

        

        
-
    ' バッファ(バイト配列)から音を鳴らすためのPlaySound関数 (API関数)
-
    <Runtime.InteropServices.DllImport("winmm.dll", EntryPoint:="PlaySound")> _
-
    Private Shared Function PlaySoundFromMemory( _
-
       <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPArray)> ByVal lpBuffer As Byte(), _
-
       ByVal hModule As Integer, _
-
       ByVal dwFlags As Integer) _
-
       As Integer
-
    End Function
 

        

        
~
*MonoDevelopでのリソースの埋め込みと読み込み
    ' PlaySound関数で再生方法を指定する定数
~
ここではリソースの埋め込みと読み込みの方法をMonoDevelop 3.0を使った場合を例にとって解説します。
    Private Const SND_ASYNC As Integer = &H1    ' 非同期再生
-
    Private Const SND_MEMORY As Integer = &H4    ' バッファからの再生
 

        

        
~
**リソースの埋め込み
    ' バッファとしてのバイト配列
~
まずはリソースとして埋め込みたいファイルを選択します。 プロジェクトを右クリックし、[追加]メニューから[ファイルを追加]を選択します。 なお、[新しいファイル]を選択すると、追加するリソースファイルを新規に作成出来ます。
    Dim soundBuffer() As Byte
+
#image(md3.0-00.png,60%,プロジェクトへのファイルの追加)
 

        

        
~
次に、ファイルを選択します。 このとき、[開く]ボタンを押す前に、「デフォルトビルドアクションをオーバーライドします」にチェックを入れ、追加しようとするファイルが埋め込みリソースであることを指定するため「EmbeddedResource」を選択します。
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
+
#image(md3.0-01.png,60%,追加するファイルの選択)
 

        

        
~
追加するファイルがプロジェクトのディレクトリ外にある場合は、追加するファイルをプロジェクトのディレクトリにコピーもしくは移動するか、リンクとして追加するかを問われます。 リソースファイルの管理方法に応じて適切なものを選んでください。
        ' 現在実行中のアセンブリを取得
~
#image(md3.0-02.png,60%,プロジェクトへのファイルの追加方法)
        Dim assm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()
 

        

        
~
これでプロジェクトにリソースとして埋め込まれるファイルが追加されます。
        ' リソースのストリームを取得
~
#image(md3.0-03.png,追加されたファイル)
        Dim stream As IO.Stream = assm.GetManifestResourceStream("ResourceAndMultimedia.Sample.wav")
 

        

        
~
**リソースの読み込み
        ' 取得できたストリームを元にバイナリ形式で読み込むためのBinaryReaderオブジェクトを作成
~
プロジェクトに追加したリソースを実行時に読み込むには、先に解説した[[GetManifestResourceStreamメソッド>#Assembly.GetManifestResourceStream]]を使って読み込みます。
        Dim reader As New IO.BinaryReader(stream)
 

        

        
~
まず、リソースファイルを読み込むためのリソースIDを確認しておきます。 プロジェクトに追加したリソースファイルを右クリックし、[プロパティ]を表示します。 ここでリソースIDを確認します。 デフォルトでは、「&var{プロジェクト名};.&var{ファイル名};」がリソースIDとなっています。 このタブでは、必要に応じてリソースIDを変更することも出来ます。
        ' バッファにリソースの内容を読み込み
~
#image(md3.0-04.png,60%,リソースIDの確認)
        soundBuffer = reader.ReadBytes(CInt(reader.BaseStream.Length))
 

        

        
~
あとは、このリソースIDをGetManifestResourceStreamメソッドの引数で指定してリソースのStreamを取得し、読み込むだけです。
        ' ストリームをクローズ
-
        reader.Close()
 

        

        
~
#code(cs,リソースからテキストファイルを読み込み、内容を表示する例){{
    End Sub
+
using System;
+
using System.IO;
+
using System.Reflection;
 

        

        
~
namespace Sample
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
+
{
+
  class MainClass
+
  {
+
    public static void Main(string[] args)
+
    {
+
      var assm = Assembly.GetExecutingAssembly();
 

        

        
~
      using (var stream = assm.GetManifestResourceStream("Sample.sample.txt")) {
        ' バッファを再生
~
        var reader = new StreamReader(stream);
        PlaySoundFromMemory(soundBuffer, Nothing, SND_ASYNC Or SND_MEMORY)
 

        

        
~
        Console.WriteLine(reader.ReadToEnd());
    End Sub
+
      }
+
    }
+
  }
+
}
+
}}
 

        

        
~
#code(,sample.txtの内容){{
End Class
+
sample.txt
+
これはリソースとして埋め込まれたテキストファイルです。
 
}}
}}
 

        

        
~
このコードを実行すると、以下のようにリソースとして追加したテキストファイルの内容が表示されるはずです。
まず、Wave音声を再生するためのAPI関数であるPlaySound関数について説明する必要があります。 APIとは何か、またAPIを詳しく知らない方はそういうものだと思って読み飛ばしてもかまいません。 この関数は、Waveファイル・リソース・システムの音声のいずれかのWave音声を鳴らすものです。 この場合のリソースは、ここで使用しているリソースの形式と異なるので利用することはできません。 この関数の一つ目のパラメータは LPCSTR型で、三つ目のパラメータでSND_FILENAMEフラグを指定した場合はファイル名を指定し、SND_MEMORYフラグを指定した場合はバッファとして格納されているWaveイメージへの先頭ポインタを指定します。 この例では後者の方法を利用しています。 また、二番目のパラメータは指定すべき値がないのでNothingにしておきます。
 

        

        
~
#image(md3.0-05.png,リソースを読み込んだ例)
このAPIをVB.NETで使用するため、DllImport属性を利用してインポートしています。 また、バッファからの再生をサポートするため、LPCSTR型である一つ目のパラメータは、MarshalAs属性で配列へのポインタ型へマーシャリングします。 そして、メモリからの再生に特化したPlaySoundであることを示すために、メソッド名をPlaySoundFromMemory()に変更しました。 ちなみに、 C++形式でのPlaySound関数の宣言は次のようになっています。
+

          
+
テキストファイル以外のものも、同様の手順で埋め込み・読み込みすることが出来ます。
 

        

        
-
#code(c,PlaySound関数){{
-
BOOL PlaySound(
-
    LPCSTR pszSound,  // 再生対象のサウンド
-
    HMODULE hmod,     // インスタンスハンドル
-
    DWORD fdwSound    // 再生フラグ
-
);
-
}}
 

        

        
-
リソースからWaveファイルを読み込む場合は、バイト配列として取得することでPlaySound関数が利用可能になるため、BinaryReader クラスのReadBytes()メソッドを利用して直接バイト配列を取得しています。 後は、再生したいときにPlaySoundFromMemory関数にWaveイメージが格納されたバッファと再生フラグを渡すだけで再生することができます。