포함 및 Visual C# 를 사용하여 리소스에 액세스하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 319292 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Visual C# 리소스를 해당 어셈블리에 일부로 포함 및 다음 런타임에 리소스에 액세스하는 방법을 설명합니다.

개요

.NET Framework 파일이 컴파일된 어셈블리의 일부로 캡슐화할 수 있습니다. 이러한 파일은 포함된 리소스로 알려져 있습니다. 이러한 리소스는 어셈블리 관련된 .resources 및 .resx 파일을 완전히 별개입니다. 런타임에 어셈블리 클래스 System.Reflection 네임스페이스를 통해 이러한 리소스에 액세스할 수 있습니다.

주요 장점은 있는 매니페스트 리소스를 포함 파일이 컴파일된 어셈블리에 속하기 때문에 사용자가 실수로 삭제하거나 없습니다 프로그램 실행을 방지할 수 있는 경우에 응용 프로그램을 위해 중요한 파일은 도용되기가 것을 것입니다. 사용자가 변경 내용을 이 파일을 어셈블리에 프로그램을 다시 컴파일하지 않고도 저장할 수 없습니다 이 방법의 한 가지 제한이 사항입니다. 이 만때문에 포함 리소스로 응용 프로그램의 수명 동안 변경되는 파일이 포함됩니다.

단계별 데모

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

포함된 리소스 추가

텍스트 파일 및 이미지 파일이 포함된 리소스로 프로젝트에 추가하려면 다음과 같이 하십시오.
  1. 이 데모에서는 Windows 응용 프로그램 프로젝트를 새로 만듭니다. 이 양식 실행된 시간 동안 실행 중인 어셈블리에서 액세스할 리소스를 표시할 수 있습니다.
  2. 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가 클릭한 다음 새 항목 추가 클릭하십시오.
  3. 새 항목 대화 상자에서 텍스트 파일 메뉴에서 선택하고 파일 이름을 MyTextFile.txt. 통합된 개발 환경 (IDE) 파일을 열 때 일부 텍스트를 추가하고 파일을 닫습니다.
  4. 프로젝트에 있지만 새 항목 형식으로 텍스트 파일 선택하는 대신 비트맵 이미지를 추가하려면 2단계를 반복합니다. 그리고 비트맵 파일 을 선택하고 파일 이름을 MyImage.bmp 수 변경하십시오. 새 이미지 IDE에서 열릴 때 뭔가 이미지를, 그리고 파일을 닫습니다.
  5. 텍스트 파일 또는 비트맵, 마우스 오른쪽 단추로 클릭한 다음 속성 을 선택하십시오.
  6. 속성 대화 상자에서 빌드 작업 속성을 찾습니다. 기본적으로 이 속성은 콘텐츠 설정됩니다. 속성을 클릭하고 빌드 작업 속성을 포함 리소스 로 변경하십시오.
  7. 다른 파일에 대해 4-5단계를 반복하십시오.
다음에 프로젝트를 빌드할 때 컴파일러에서 이러한 파일을 어셈블리에 추가합니다. 프로젝트에 포함된 경우 컴파일러는 리소스의 이름을 프로젝트의 루트 네임스페이스를 추가합니다. 예를 들어, 프로젝트의 루트 네임스페이스를 MyNamespace 경우 리소스 MyNamespace.MyTextFile.txt 및 MyNamespace.MyImage.bmp 이름이 지정됩니다.

참고: 리소스 파일 이름은 대/소문자를 구분합니다. 리소스를 액세스할 때 정확한 맞춤법 및 파일 이름의 대/소문자를 사용해야 합니다. 정확한 맞춤법 사용 및 메서드 호출이 ManifestResourceStream 액세스하려면 파일 이름의 대/소문자를 Nothing 및 시스템 반환합니다 경우 예외를 발생시키지 않습니다.

참고: 자원 이름을 확인하려는 경우, 해당 Microsoft 중간 언어 디스어셈블러 (ILDASM) 포함된 리소스를 나열하는 매니페스트 데이터를 볼 수 있습니다.

리소스 액세스

어셈블리 매니페스트가 포함된 리소스에 액세스하려면 System.IOSystem.Reflection 네임스페이스를 다음과 같은 가져오기:
   using System.IO;
   using System.Reflection;
				
System.IO 네임스페이스 스트림을 정의를 제공하며 System.Reflection 네임스페이스는 어셈블리에 포함된 리소스에 액세스할 수 있는 메서드를 제공합니다 어셈블리 클래스를 정의합니다.

일반 선언 영역에 다음 선언할 때 폼이 로드될 때 어셈블리에서 리소스를 읽을 수 있습니다:
   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;
				
참고: 코드 편집기에서 폼의 Load 이벤트에 액세스하기 위해 디자인 편집기에서 폼을 두 번 클릭합니다.

현재 코드가 실행 중인 어셈블리에서 리소스를 읽기 위해 해당 어셈블리 인스턴스를 얻어야 합니다. 이렇게 하려면 어셈블리의 GetExecutingAssembly 메서드는 다음과 같은 사용:
   _assembly = Assembly.GetExecutingAssembly();
				
GetManifestResourceStream 메서드 호출하여 스트림에 리소스에서 정보를 읽기 수행됩니다. 이 메서드에 전달된 매개 변수에 액세스할 수 있는 리소스 이름입니다. 폼의 Load 이벤트가 실행될 때 다음 두 가지 리소스는 자신의 해당 스트림은 읽습니다.
   _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!");
   }
				
구조적된 오류 처리를 .NET 에서 으로 알려져 있는 Try Catch 문을 리소스를 어셈블리 클래스의 인스턴스에 액세스하는 동안 발생한 모든 오류를 catch할 수 있습니다.

디스플레이 리소스

이 예제에서는 두 개의 단추를 사용하여 포함된 리소스를 표시합니다. 첫 번째 단추를 클릭하면 어셈블리에서 읽을 리소스 기반으로 비트맵 이미지는 만들고 폼의 PictureBox 컨트롤이 표시됩니다. 두 번째 단추가 텍스트 리소스에서 읽은 다음 텍스트 상자에 텍스트를 표시합니다.

포함된 리소스는 표시하려면 다음과 같이 하십시오.
  1. PictureBox 컨트롤을 폼에 추가하십시오.
  2. Button 컨트롤을 폼에 추가하고 이미지 표시Text 속성을 변경하십시오.
  3. 해당 Click 이벤트를 코드 뷰어를 열려면 단추를 두 번 클릭한 다음 이 이벤트에서 다음 코드를 붙여 넣습니다.
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    이 코드를 폼의 Load 이벤트에 읽은 리소스 스트림을 기반으로 비트맵 새 인스턴스를 생성합니다.

  4. TextBox 컨트롤을 폼에 추가하십시오.
  5. 다른 Button 컨트롤을 폼에 추가하고 텍스트 가져오기Text 속성을 변경하십시오.
  6. 디자인 편집기에서 단추에 대한 Click_Event 열기 단추를 두 번 클릭한 다음 이벤트에 다음 코드를 붙여 넣습니다.
       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }
    					
    이 코드를 읽을 수 문자 스트림에서 남아 있는지 여부를 결정합니다. 문자가 발견되지 않으면 텍스트 상자가 있는 줄을 읽습니다.

  7. 응용 프로그램을 실행하려면 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 Forms 프로젝트를 만들 때 Visual C# 한 폼을 프로젝트에 기본적으로 추가됩니다. 이 폼은 Form1을 이라고 합니다. 폼을 나타내는 두 파일의 Form1.cs 및 Form1.designer.cs가 지정됩니다. Form1.cs 있는 코드를 작성할 수 있습니다. Designer.cs 파일은 Windows Forms 디자이너에 컨트롤을 추가하여 수행된 모든 작업을 구현하는 코드를 기록하는 위치 있습니다. Windows Forms 디자이너를 Visual C# 2005에서 또는 Visual Studio 2008에 [NULL]에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
http://msdn2.microsoft.com/en-us/library/ms173077.aspx

문제 해결

리소스 이름은 대/소문자를 구분하지 않으므로 맞춤법과 액세스할 수 있는 리소스 대 사용하고 있는지 확인하십시오. ILDASM을 리소스 정확한 철자를 확인하기 위해 매니페스트 데이터를 읽을 수 있습니다.

참조

자세한 내용은 다음 MSDN) Microsoft 개발자 네트워크 (웹 사이트를 참조하십시오.
System.Reflection 네임스페이스
http://msdn2.microsoft.com/en-us/library/system.reflection(vs.71).aspx

어셈블리 클래스
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly(vs.71).aspx

Assembly.GetManifestResourceStream 메서드
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.getmanifestresourcestream(vs.71).aspx

속성

기술 자료: 319292 - 마지막 검토: 2008년 7월 15일 화요일 - 수정: 3.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
키워드:?
kbmt kbsweptvs2008 kbhowtomaster KB319292 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com