C#에 포함된 리소스를 어떻게 사용하나요?
이 단계별 가이드에서는 C#을 사용하여 리소스를 어셈블리의 일부로 포함시킨 다음 런타임 시 리소스에 액세스하는 방법을 보여줍니다.
.NET Framework는 파일을 컴파일된 어셈블리의 일부로 캡슐화할 수 있습니다. 이러한 파일을 포함된 리소스라고 합니다. 이러한 리소스는 .resource 및 .resx 파일과 연결된 완전히 별도의 어셈블리입니다. System.Reflection 네임스페이스 의 Assembly 클래스를 통해 런타임에 이러한 리소스에 액세스할 수 있습니다.
내장된 매니페스트 리소스의 가장 큰 장점은 이러한 파일이 컴파일된 어셈블리의 일부이기 때문에 사용자가 실수로 해당 파일을 삭제하거나 애플리케이션에 실수로 넣을 수 없다는 것입니다. 중요한 파일로 인해 프로그램이 실행되지 않을 수 있습니다. 이 접근 방식의 한 가지 제한 사항은 프로그램을 다시 컴파일하지 않으면 이 파일 어셈블리의 변경 사항을 저장할 수 없다는 것입니다. 따라서 애플리케이션 수명 동안 변경되지 않는 파일만 포함 리소스로 포함하세요.
프로젝트에 포함된 리소스를 추가하려면 먼저 이러한 파일을 프로젝트의 일부로 추가해야 합니다. 프로젝트에 파일을 추가한 후 System.Reflection 네임스페이스의 리소스에 액세스하고 표시할 수 있습니다.
프로젝트에 리소스로 삽입할 텍스트 파일과 이미지 파일을 추가하려면 다음 단계를 따르세요.
이 데모를 위한 새로운 Windows 애플리케이션 프로젝트를 만듭니다. 이 양식은 실행 중인 어셈블리에서 런타임에 액세스되는 리소스를 표시하는 데 사용됩니다.
프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭한 다음 새 항목 추가
새 프로젝트 대화 상자의 메뉴에서 텍스트 파일을 선택하고 파일 이름을 MyText파일.txt로 지정합니다. IDE(통합 개발 환경)에서 파일을 열고 일부 텍스트를 추가한 다음 파일을 닫습니다.
텍스트 파일을 선택하는 대신 비트맵 파일을 선택합니다. 파일 이름을 MyImage.bmp로 변경하세요. IDE에서 새 이미지를 열면 이미지에 콘텐츠가 그려진 다음 파일이 닫힙니다.
대화 상자에서 빌드 작업 속성을 찾습니다. 기본적으로 이 속성은 content로 설정됩니다. 속성을 클릭하고 Build Action 속성을 Embedded Resource
참고
: 리소스 파일 이름은 대소문자를 구분합니다. 리소스에 액세스할 때 파일 이름의 정확한 철자와 대소문자를 사용해야 합니다. 파일 이름의 정확한 철자와 대소문자를 사용하지 않으면 ManifestResourceStream에 액세스하기 위한 메서드 호출이 아무런 작업도 수행하지 않습니다를 반환하고 시스템은 오류를 발생시키지 않습니다. 이상.
참고
: 이러한 리소스 이름을 확인하려면 ILDASM(Microsoft Intermediate Language Disassembler)을 사용하여 포함된 리소스를 나열하는 매니페스트 데이터를 볼 수 있습니다.
리소스 액세스
및 System.Reflection 네임스페이스는 다음과 같습니다.
using System.IO; using System.Reflection;
System.IO 네임스페이스는 스트림 정의를 제공하고 System.Reflection 네임스페이스는 어셈블리에서 어셈블리에 포함된 리소스에 액세스하기 위해 제공하는 클래스에 대한 메서드를 정의합니다.
다음 일반 선언 영역에서 선언된 경우 양식이 로드될 때 어셈블리에서 리소스를 읽습니다.
Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader;
참고: 코드에서 액세스하려면의 경우 🎜>에디터에서 폼이벤트를 로드하고, 디자인 편집기에서 해당 폼을 더블클릭하세요. 현재 코드가 실행 중인 어셈블리에서 리소스를 읽으려면 해당 어셈블리의 인스턴스를 가져와야 합니다. 이렇게 하려면 다음과 같이 어셈블리의
GetExecutingAssembly
메서드를 사용합니다. _assembly = Assembly.GetExecutingAssembly();
는
메서드를 사용하여 리소스에서 스트림으로 정보를 읽습니다. 실행을 호출합니다. 이 메소드에 전달되는 매개변수는 액세스할 리소스의 이름입니다. 양식의 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!");
}
문, .NET에서 호출, 구조적오류 처리는 어셈블리 클래스의 인스턴스가 리소스에 액세스할 때 발생할 수 있는 오류를 캡처하는 데 사용됩니다.
리소스 표시
을 사용하여 포함된 리소스를 표시합니다. 첫 번째 버튼을 클릭하면 어셈블리에서 읽은 리소스를 기반으로 하는 비트맵 이미지가 생성되어 양식의 그림 상자컨트롤에 표시됩니다. 두 번째 버튼의 텍스트 리소스를 읽어 텍스트 상자에 표시합니다. 포함된 리소스를 표시하려면 다음 단계를 따르세요.
컨트롤을 추가합니다.
컨트롤을 양식에 추가한 다음 Text 속성을 이미지 표시 로 변경합니다.
이벤트를 연 후 이 경우 다음 코드를 붙여넣습니다.
try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); }
이벤트에 있는 리소스 스트림에서 읽은 비트맵을 기반으로 새 인스턴스를 생성합니다.
컨트롤을 추가합니다.
컨트롤을 양식에 추가한 다음 Text 속성을 Get Text로 변경합니다.
를 연 후 이벤트에 다음 코드를 붙여넣습니다.
try { if(_textStreamReader.Peek() != -1) { textBox1.Text = _textStreamReader.ReadLine(); } } catch { MessageBox.Show("Error writing text!"); }
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위 내용은 C#을 포함하고 사용하여 리소스 코드에 액세스하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!