ホームページ  >  記事  >  バックエンド開発  >  C# を埋め込み、使用してリソース コードにアクセスする方法の詳細な説明

C# を埋め込み、使用してリソース コードにアクセスする方法の詳細な説明

黄舟
黄舟オリジナル
2017-03-14 13:54:302134ブラウズ

C#で埋め込みリソースを使用するにはどうすればよいですか?

このステップバイステップのガイドでは、C# を使用してリソースをアセンブリの一部として埋め込み、実行時にリソースにアクセスする方法を示します。

概要

.NET Framework は、コンパイルされたアセンブリの一部としてファイルをカプセル化できます。これらのファイルは埋め込みリソースと呼ばれます。これらのリソースは、.resources および .resx ファイルに関連付けられた完全に別個のアセンブリです。これらのリソースには、System.Reflection名前空間assemblyクラスを介して実行時にアクセスできます。

埋め込みマニフェスト リソースの主な利点は、これらのファイルがコンパイルされたアセンブリの一部であるため、ユーザーが誤って 削除したり、誤ってアプリケーションに入れたりすることができないことです。これにより、場合によっては重要なドキュメントに対するプログラムの実行が妨げられる可能性があります。このアプローチの制限の 1 つは、プログラムを再コンパイルしないと、このファイルのアセンブリへの変更を保存できないことです。このため、アプリケーションの存続期間中に変更されないファイルのみを埋め込みリソースとして含めてください。

ステップバイステップのデモ

埋め込みリソースをプロジェクトに追加するには、まずこれらのファイルをプロジェクトの一部として追加する必要があります。プロジェクトにファイルを追加すると、System.Reflection 名前空間内のリソースにアクセスして表示できるようになります。

埋め込みリソースを追加する

プロジェクトにリソースとして埋め込むテキスト ファイルと画像ファイルを追加するには、次の手順に従います:

  1. このデモ用に新しい Windows アプリケーション プロジェクトを作成します。このフォームは、実行時に実行アセンブリからアクセスされるリソースを表示するために使用されます。

  2. プロジェクト名を右クリックし、追加をクリックし、次に新しい項目の追加

  3. をクリックします。新しいプロジェクトダイアログボックスで、メニューからテキストファイルを選択し、ファイルを選択しますMyTextFile.txtという名前です。統合開発環境 (IDE) でファイルを開き、テキストを追加してファイルを閉じます。

  4. 手順 1 と 2 を繰り返して、ビットマップ イメージをプロジェクトに追加します。ただし、新しいプロジェクト タイプとして テキスト ファイル を選択する代わりに、ビットマップ ファイル を選択し、ファイル名を MyImage に変更します。 IDE で新しい画像を開くと、コンテンツが画像上に描画され、ファイルが閉じられます。

  5. ファイルのテキストまたはビットマップを右クリックし、

    プロパティ

  6. を選択します。

    プロパティダイアログボックスで、ビルドアクションプロパティを見つけます。デフォルトでは、このプロパティは content に設定されています。プロパティをクリックし、Build Action プロパティを Embedded Resource

  7. に変更します。他のファイルに対して手順 4 と 5 を繰り返します。

次回プロジェクトをビルドするときに、コンパイラーはこれらのファイルをアセンブリに追加します。リソースがプロジェクトに含まれるときに、コンパイラーがプロジェクトのルート名前空間を追加するリソースの名前。たとえば、プロジェクトのルート ネームスペースが MyNamespace の場合、リソースの名前は MyNamespace.MyTextFile.txt および MyNamespace.MyImage.bmp になります。



注意してください: リソース ファイル名では大文字と小文字が区別されます。リソースにアクセスするときは、ファイル名のスペルと大文字小文字を正確に使用する必要があります。ファイル名の正確なスペルと大文字小文字を使用しない場合、estResourceStream が返す場合、Man にアクセスするためのメソッド呼び出しは 何も行わず 、システムは例外をスローしません。

: これらのリソース名を確認したい場合は、Microsoft Intermediate Language 逆アセンブラ (ILDASM) を使用して、含まれているリソースをリストするマニフェスト データを表示できます。

リソースへのアクセス

アセンブリのマニフェストに埋め込まれているリソースにアクセスするには、次のように

System.IO

および 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 番目のボタンのテキスト リソースが読み取られ、テキスト ボックスにテキストが表示されます。

埋め込みリソースを表示するには、次の手順に従います:

  1. ピクチャー ボックス コントロールをフォームに追加します。

  2. Text プロパティを Show Image

  3. に変更する前に、新しい
  4. Button

    コントロールをフォームに追加します。 ボタンをダブルクリックして、コード ビューアで Click イベントを開き、貼り付けますこの場合は次のコードです:

  5.    try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }					

    このコードは、フォームの Load イベントで読み取られたビットマップに基づいて、リソース ストリームの新しいインスタンスを生成します。

  6. テキストボックスコントロールをフォームに追加します。

  7. 別の Button コントロールをフォームに追加し、その Text プロパティを GetText

  8. デザインエディターでボタンをダブルクリックして Click_Event を開き、次のコードを貼り付けますそのイベント:

  9.    try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }					

    このコードは、読み取られる文字がストリーム内にまだ存在するかどうかを判断します。文字が見つかった場合は、テキスト ボックスにその行が読み上げられます。

  10. 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。