C#で埋め込みリソースを使用するにはどうすればよいですか?
このステップバイステップのガイドでは、C# を使用してリソースをアセンブリの一部として埋め込み、実行時にリソースにアクセスする方法を示します。
.NET Framework は、コンパイルされたアセンブリの一部としてファイルをカプセル化できます。これらのファイルは埋め込みリソースと呼ばれます。これらのリソースは、.resources および .resx ファイルに関連付けられた完全に別個のアセンブリです。これらのリソースには、System.Reflection名前空間のassemblyクラスを介して実行時にアクセスできます。
埋め込みマニフェスト リソースの主な利点は、これらのファイルがコンパイルされたアセンブリの一部であるため、ユーザーが誤って 削除したり、誤ってアプリケーションに入れたりすることができないことです。これにより、場合によっては重要なドキュメントに対するプログラムの実行が妨げられる可能性があります。このアプローチの制限の 1 つは、プログラムを再コンパイルしないと、このファイルのアセンブリへの変更を保存できないことです。このため、アプリケーションの存続期間中に変更されないファイルのみを埋め込みリソースとして含めてください。
埋め込みリソースをプロジェクトに追加するには、まずこれらのファイルをプロジェクトの一部として追加する必要があります。プロジェクトにファイルを追加すると、System.Reflection 名前空間内のリソースにアクセスして表示できるようになります。
プロジェクトにリソースとして埋め込むテキスト ファイルと画像ファイルを追加するには、次の手順に従います:
このデモ用に新しい Windows アプリケーション プロジェクトを作成します。このフォームは、実行時に実行アセンブリからアクセスされるリソースを表示するために使用されます。
プロジェクト名を右クリックし、追加をクリックし、次に新しい項目の追加
をクリックします。新しいプロジェクトダイアログボックスで、メニューからテキストファイルを選択し、ファイルを選択しますMyTextFile.txtという名前です。統合開発環境 (IDE) でファイルを開き、テキストを追加してファイルを閉じます。
手順 1 と 2 を繰り返して、ビットマップ イメージをプロジェクトに追加します。ただし、新しいプロジェクト タイプとして テキスト ファイル を選択する代わりに、ビットマップ ファイル を選択し、ファイル名を MyImage に変更します。 IDE で新しい画像を開くと、コンテンツが画像上に描画され、ファイルが閉じられます。
プロパティダイアログボックスで、ビルドアクションプロパティを見つけます。デフォルトでは、このプロパティは content に設定されています。プロパティをクリックし、Build Action プロパティを Embedded Resource
注意してください: リソース ファイル名では大文字と小文字が区別されます。リソースにアクセスするときは、ファイル名のスペルと大文字小文字を正確に使用する必要があります。ファイル名の正確なスペルと大文字小文字を使用しない場合、estResourceStream が返す場合、Man にアクセスするためのメソッド呼び出しは 何も行わず 、システムは例外をスローしません。
注
: これらのリソース名を確認したい場合は、Microsoft Intermediate Language 逆アセンブラ (ILDASM) を使用して、含まれているリソースをリストするマニフェスト データを表示できます。
リソースへのアクセス
および System.Reflection 名前空間をインポートします。
using System.IO; using System.Reflection;
System.IO 名前空間はストリーム定義を提供し、 名前空間で定義された System.Reflectionassembly は、クラスがアセンブリに埋め込まれたリソースにアクセスするためのメソッドを提供します。
次の一般宣言領域で宣言すると、フォームが読み込まれるときにアセンブリからリソースを読み取ります:
Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader;
注: コード editor イベント でフォームの Load にアクセスするには、デザインエディターのフォーム。
現在のコードが実行されているアセンブリからリソースを読み取るには、そのアセンブリのインスタンスを取得する必要があります。これを行うには、次のようにアセンブリの GetExecutingAssembly メソッドを使用します。
_assembly = Assembly.GetExecutingAssembly();
はリソースからストリームに情報を読み取り、GetManifestResourceStream へのメソッド呼び出しを実行します。このメソッドに渡されるパラメータは、アクセスされるリソースの名前です。フォームの Load イベントを実行し、2 つのリソースを対応するストリームに読み取ります。
_imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
フォームの Load イベントのコードは次のようになります:
try { _assembly = Assembly.GetExecutingAssembly(); _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt")); } catch { MessageBox.Show("Error accessing resources!"); }
Try-catch ステートメント (.NET では、構造化エラー処理) は、キャッチするために使用されますアセンブリ クラスのインスタンスがリソースにアクセスするときに発生します。
この例では、2 つの ボタンを使用して埋め込みリソースを表示します。最初のボタンをクリックすると、アセンブリから読み取られたリソースに基づいてビットマップ画像が作成され、フォームのピクチャーボックスコントロールに表示されます。 2 番目のボタンのテキスト リソースが読み取られ、テキスト ボックスにテキストが表示されます。
埋め込みリソースを表示するには、次の手順に従います:
ピクチャー ボックス コントロールをフォームに追加します。
Text プロパティを Show Image
コントロールをフォームに追加します。 ボタンをダブルクリックして、コード ビューアで Click イベントを開き、貼り付けますこの場合は次のコードです:
try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); }
このコードは、フォームの Load イベントで読み取られたビットマップに基づいて、リソース ストリームの新しいインスタンスを生成します。
テキストボックスコントロールをフォームに追加します。
別の Button コントロールをフォームに追加し、その Text プロパティを GetText
デザインエディターでボタンをダブルクリックして Click_Event を開き、次のコードを貼り付けますそのイベント:
try { if(_textStreamReader.Peek() != -1) { textBox1.Text = _textStreamReader.ReadLine(); } } catch { MessageBox.Show("Error writing text!"); }
このコードは、読み取られる文字がストリーム内にまだ存在するかどうかを判断します。文字が見つかった場合は、テキスト ボックスにその行が読み上げられます。
F5 キーを押してアプリケーションを実行します。
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Reflection; namespace MyNamespace { /// <summary> /// Summary description for Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Required for Windows Form Designer support. // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call. // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // pictureBox1 // this.pictureBox1.Location = new System.Drawing.Point(4, 8); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new System.Drawing.Size(284, 192); this.pictureBox1.TabIndex = 0; this.pictureBox1.TabStop = false; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(92, 236); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(192, 20); this.textBox1.TabIndex = 1; this.textBox1.Text = "textBox1"; // // button1 // this.button1.Location = new System.Drawing.Point(8, 208); this.button1.Name = "button1"; this.button1.TabIndex = 2; this.button1.Text = "Show Image"; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(8, 236); this.button2.Name = "button2"; this.button2.TabIndex = 3; this.button2.Text = "Get Text"; this.button2.Click += new System.EventHandler(this.button2_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 266); this.Controls.AddRange(new System.Windows.Forms.Control[]{ this.button2, this.button1, this.textBox1, this.pictureBox1}); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } #endregion Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } private void Form1_Load(object sender, System.EventArgs e) { try { _assembly = Assembly.GetExecutingAssembly(); _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt")); } catch { MessageBox.Show("Error accessing resources!"); } } private void button1_Click(object sender, System.EventArgs e) { try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); } } private void button2_Click(object sender, System.EventArgs e) { try { if(_textStreamReader.Peek() != -1) { textBox1.Text = _textStreamReader.ReadLine(); } } catch { MessageBox.Show("Error writing text!"); } } } }
注 Visual Studio 2005 または Visual Studio 2008 を使用している場合は、コードを変更する必要があります。 Windows フォーム プロジェクトを作成すると、Visual C# は既定でフォームをプロジェクトに追加します。このフォームの名前は Form1 です。フォームを表す 2 つのファイルは次のように呼ばれます。 Form1.cs と Form1.designer.cs。 Form1.cs にコードを記述します。 Designer.cs ファイルは、コントロールの追加によって実行されるすべてのアクションを実装する、Windows フォーム デザイナーによって記述されたコードです。 Visual C# 2005 または Visual Studio 2008 の Windows フォーム デザイナーの詳細については、以下の Microsoft を参照してください。 Web サイト:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx
リソース名では大文字と小文字が区別されるため、適切なスペルを使用していることを確認してください。大文字と小文字のリソースへのアクセス。 ILDASM を使用してマニフェストのデータを読み取り、リソースの正確なスペルを確認できます。
以上がC# を埋め込み、使用してリソース コードにアクセスする方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。