>  기사  >  백엔드 개발  >  C#을 포함하고 사용하여 리소스 코드에 액세스하는 방법에 대한 자세한 설명

C#을 포함하고 사용하여 리소스 코드에 액세스하는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-14 13:54:302140검색

C#에 포함된 리소스를 어떻게 사용하나요?

이 단계별 가이드에서는 C#을 사용하여 리소스를 어셈블리의 일부로 포함시킨 다음 런타임 시 리소스에 액세스하는 방법을 보여줍니다.

개요

.NET Framework는 파일을 컴파일된 어셈블리의 일부로 캡슐화할 수 있습니다. 이러한 파일을 포함된 리소스라고 합니다. 이러한 리소스는 .resource 및 .resx 파일과 연결된 완전히 별도의 어셈블리입니다. System.Reflection 네임스페이스 Assembly 클래스를 통해 런타임에 이러한 리소스에 액세스할 수 있습니다.

내장된 매니페스트 리소스의 가장 큰 장점은 이러한 파일이 컴파일된 어셈블리의 일부이기 때문에 사용자가 실수로 해당 파일을 삭제하거나 애플리케이션에 실수로 넣을 수 없다는 것입니다. 중요한 파일로 인해 프로그램이 실행되지 않을 수 있습니다. 이 접근 방식의 한 가지 제한 사항은 프로그램을 다시 컴파일하지 않으면 이 파일 어셈블리의 변경 사항을 저장할 수 없다는 것입니다. 따라서 애플리케이션 수명 동안 변경되지 않는 파일만 포함 리소스로 포함하세요.

단계별 데모

프로젝트에 포함된 리소스를 추가하려면 먼저 이러한 파일을 프로젝트의 일부로 추가해야 합니다. 프로젝트에 파일을 추가한 후 System.Reflection 네임스페이스의 리소스에 액세스하고 표시할 수 있습니다.

삽입된 리소스 추가

프로젝트에 리소스로 삽입할 텍스트 파일과 이미지 파일을 추가하려면 다음 단계를 따르세요.

  1. 이 데모를 위한 새로운 Windows 애플리케이션 프로젝트를 만듭니다. 이 양식은 실행 중인 어셈블리에서 런타임에 액세스되는 리소스를 표시하는 데 사용됩니다.

  2. 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭한 다음 새 항목 추가

  3. 새 프로젝트 대화 상자의 메뉴에서 텍스트 파일을 선택하고 파일 이름을 MyText파일.txt로 지정합니다. IDE(통합 개발 환경)에서 파일을 열고 일부 텍스트를 추가한 다음 파일을 닫습니다.

  4. 1단계와 2단계를 반복하여 비트맵 이미지를 프로젝트에 추가하되, 새 프로젝트 유형으로

    텍스트 파일을 선택하는 대신 비트맵 파일을 선택합니다. 파일 이름을 MyImage.bmp로 변경하세요. IDE에서 새 이미지를 열면 이미지에 콘텐츠가 그려진 다음 파일이 닫힙니다.

  5. 파일 텍스트 또는 비트맵을 마우스 오른쪽 버튼으로 클릭하고

    속성

  6. 을 선택합니다. 🎜>속성

    대화 상자에서 빌드 작업 속성을 ​​찾습니다. 기본적으로 이 속성은 content로 설정됩니다. 속성을 클릭하고 Build Action 속성을 ​​Embedded Resource

  7. 로 변경하고 다른 파일에 대해 4단계와 5단계를 반복합니다.
  8. 다음번에 프로젝트를 빌드할 때 컴파일러는 이러한 파일을 어셈블리에 추가합니다. 프로젝트에 포함될 때 컴파일러가 프로젝트의 루트 네임스페이스를 추가하는 리소스의 이름입니다. 예를 들어 프로젝트의 루트 네임스페이스가 MyNamespace인 경우 리소스 이름은 MyNamespace.MyTextFile.txt 및 MyNamespace.MyImage.bmp로 지정됩니다.


참고
: 리소스 파일 이름은 대소문자를 구분합니다. 리소스에 액세스할 때 파일 이름의 정확한 철자와 대소문자를 사용해야 합니다. 파일 이름의 정확한 철자와 대소문자를 사용하지 않으면 ManifestResourceStream에 액세스하기 위한 메서드 호출이 아무런 작업도 수행하지 않습니다를 반환하고 시스템은 오류를 발생시키지 않습니다. 이상.
참고
: 이러한 리소스 이름을 확인하려면 ILDASM(Microsoft Intermediate Language Disassembler)을 사용하여 포함된 리소스를 나열하는 매니페스트 데이터를 볼 수 있습니다.

리소스 액세스

어셈블리 매니페스트에 포함된 리소스에 액세스하려면

System.IO

System.Reflection 네임스페이스는 다음과 같습니다.

   using System.IO;
   using System.Reflection;				

System.IO 네임스페이스는 스트림 정의를 제공하고 System.Reflection 네임스페이스는 어셈블리에서 어셈블리에 포함된 리소스에 액세스하기 위해 제공하는 클래스에 대한 메서드를 정의합니다.
다음 일반 선언 영역에서 선언된 경우 양식이 로드될 때 어셈블리에서 리소스를 읽습니다.

   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;				

참고: 코드에서 액세스하려면의 경우 🎜>에디터에서 폼이벤트를 로드하고, 디자인 편집기에서 해당 폼을 더블클릭하세요. 현재 코드가 실행 중인 어셈블리에서 리소스를 읽으려면 해당 어셈블리의 인스턴스를 가져와야 합니다. 이렇게 하려면 다음과 같이 어셈블리의
GetExecutingAssembly
메서드를 사용합니다.

   _assembly = Assembly.GetExecutingAssembly();				

GetManifestResourceStream

메서드를 사용하여 리소스에서 스트림으로 정보를 읽습니다. 실행을 호출합니다. 이 메소드에 전달되는 매개변수는 액세스할 리소스의 이름입니다. 양식의 Load 이벤트를 실행한 다음 두 리소스를 해당 스트림으로 읽어옵니다. 양식의 Load 이벤트에 있는

   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));				

코드는 다음과 같습니다.

   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에서 호출, 구조적오류 처리어셈블리 클래스의 인스턴스가 리소스에 액세스할 때 발생할 수 있는 오류를 캡처하는 데 사용됩니다.

리소스 표시

이 예에서는 두 개의

버튼

을 사용하여 포함된 리소스를 표시합니다. 첫 번째 버튼을 클릭하면 어셈블리에서 읽은 리소스를 기반으로 하는 비트맵 이미지가 생성되어 양식의 그림 상자컨트롤에 표시됩니다. 두 번째 버튼의 텍스트 리소스를 읽어 텍스트 상자에 표시합니다. 포함된 리소스를 표시하려면 다음 단계를 따르세요.

    양식에
  1. Picture Box

    컨트롤을 추가합니다.

  2. Button

    컨트롤을 양식에 추가한 다음 Text 속성을 ​​이미지 표시 로 변경합니다.

  3. 버튼을 두 번 클릭하여 코드 뷰어에서
  4. 클릭

    이벤트를 연 후 이 경우 다음 코드를 붙여넣습니다.

       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }					
  5. 이 코드는 양식의
  6. Load

    이벤트에 있는 리소스 스트림에서 읽은 비트맵을 기반으로 새 인스턴스를 생성합니다.

  7. 양식에
  8. TextBox

    컨트롤을 추가합니다.

  9. 다른
  10. Button

    컨트롤을 양식에 추가한 다음 Text 속성을 ​​Get Text로 변경합니다.

  11. 디자인 편집기에서 버튼을 두 번 클릭하여
  12. Click_Event

    를 연 후 이벤트에 다음 코드를 붙여넣습니다.

       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }					
  13. 이 코드는 읽어야 할 문자가 스트림에 아직 존재하는지 여부를 결정합니다. 문자가 발견되면 텍스트 상자에서 해당 줄을 읽습니다.


  14. F5를 눌러 애플리케이션을 실행합니다.
  15. 전체 코드
   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 Forms 프로젝트를 만들면 Visual C#에서는 기본적으로 프로젝트에 양식을 추가합니다. 이 양식의 이름은 Form1입니다. 양식을 나타내는 두 파일은 다음과 같습니다. Form1.cs 및 Form1.designer.cs. Form1.cs에 코드를 작성합니다. Designer.cs 파일은 컨트롤을 추가하여 수행하는 모든 작업을 구현하는 Windows Forms 디자이너에서 작성한 코드입니다. Visual C# 2005 또는 Visual Studio 2008의 Windows Forms 디자이너에 대한 자세한 내용을 보려면 아래 Microsoft를 방문하세요. 웹 사이트: http://msdn2.microsoft.com/en-us/library/ms173077.

asp

x문제 해결

리소스 이름은 대소문자를 구분합니다. 적절한 철자와 대소문자를 사용하여 리소스에 액세스하고 있는지 확인하십시오. ILDASM을 사용하여 매니페스트의 데이터를 읽고 리소스의 정확한 철자를 확인할 수 있습니다.


위 내용은 C#을 포함하고 사용하여 리소스 코드에 액세스하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.