반응형

C#을 이용해서 데이터중 이미지나 텍스트를 실행파일에 포함했다가 사용해야 하는 경우가 종종 있다. 

이때 사용되어 지는 방법을 정리해본다. 


우선 리소스 데이터를 참조하기 위해서는 아래와 같이 참조 선언을 먼저 해준다. 

   using System.IO;
   using System.Reflection;


다음 어셈블리 정보를 일겅오기 위한 변수와 스트림 관련 변수등을 선언해 둔다. 

Assembly _assembly;
Stream _imageStream;
StreamReader _textStreamReader;


해당 실행중인 파일의 어셈블리 정보를 얻어와야 한다. 

 _assembly = Assembly.GetExecutingAssembly();


이제 각각의 읽어오고자 하는 파일을 스트림에 가져온다. 

 _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");

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


여기서 MyNameSpace 라는 항목이 중요하다. 보통은 이것을 파악 못하고 사용하면,
항상 null 값을 받환하기 때문에 컴파일후 실행 할때 new 할당하고 사용하라는 오류 메세지가 나온다. 

이부분은 뒤에서 다시 정리하기로 하고, 일단 이부분이 중요하다는 것을 확인해 둔다. 

실제 데이터를 읽어오는 부분을 정리하면,

try
{
  _assembly = Assembly.GetExecutingAssembly();
  _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
  _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));

}

catch
{
  MessageBox.Show("Error accessing resources!");
}


이제 사용하면 되는데 리소스 등록을 위해서 일반 소스파일이나 리소스 파일처럼 파일을 등록하고 

등록된 파일의 속성을 확인해본다. 


빌드 작업의 내용을 "포함 리소스" 항목으로 바꾸어야 컴파일후 리소스에 포함이 된다.

그러면 이제 컴파일하고 실행해보면 바로 정상 작동을 하느냐? 물론 잘 될수도 있겠지만, 대부분 
앞서 중요하다는 부분의 내용을 간파하고 진행했다면, 아마도 _assembly.GetManifestResourceStream() 호출 부분에서 에러가 나올 것이다. 

실제 포함된 파일의 정보는 namespace 정보가 들어가는데, "Resources" 같은 폴더 아래에 들어가 있다면
데이터 이름은 NamespaceName.Resource.실제데이터명"이라고 작성을 해야 한다. 

관련해서 인터넷에 서치해보면 꾀 많은 질문이 null 값으로 인해 문제시되는 이슈가 많다. 

자 그래서 한방에 해결하는 방법이 없을까 해서 찾아보니... 

어셈블러를 통해 리소스의 파일 이름들을 한꺼번에 얻어올 수 있는 함수가 있었다. 

 string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();

바로 이녀석인데, 디버깅 모드에서 자신의 프로그램에 담겨져 있는 리소스 파일 이름을 파악할 수 있다. 
이것을 통해 내가 얻고자 하는 파일의 실제 긴 이름을 확인후 코드에 넣던가 하면 될 것이다. 

한참을 이것 때문에 삽질을 해서 정리해 둔다. 


참고 사이트 : http://support.microsoft.com/kb/319292/ko
                   http://stackoverflow.com/questions/3068736/cant-load-a-manifest-resource-with-getmanifestresourcestream





반응형

+ Recent posts