IT/C#

[C#] System.Resources.MissingManifestResourceException 원인과 해결방법

Ella.J 2025. 9. 15. 16:17
728x90
반응형

 

C#에서 System.Resources.MissingManifestResourceException 예외는 리소스(.resx) 파일을 찾지 못했을 때 주로 발생합니다. 즉, 코드에서 ResourceManager로 특정 리소스를 로드하려고 하는데 어셈블리에 해당 리소스가 포함되지 않았거나, 네임스페이스/이름이 일치하지 않을 때 발생합니다.

 


📌 주요 발생 원인

  1. 리소스 이름 불일치
    • ResourceManager("MyProject01.Properties.Resources", typeof(Program).Assembly) 와 같이 리소스를 찾을 때 지정한 이름이 .resx 파일과 일치하지 않는 경우.
    • .resx 파일이 네임스페이스 + 파일명 형식으로 내장되는데, 이 이름이 코드에서 사용한 것과 달라서 생김.


  2. 빌드 액션(Build Action) 문제
    • .resx 파일의 Build Action(빌드 작업)이 Embedded Resource(포함 리소스)가 아닌 경우.
    • 보통 Embedded Resource(포함 리소스)여야 dll 안에 포함됨.
  3. 리소스 파일 위치/경로 문제
    • 프로젝트 구조에서 폴더가 다르거나 namespace 가 달라서 발생.
  4. 위성 어셈블리(satellite assembly) 문제
    • 다국어 지원(예: Resources.ko.resx) 할 때 리소스 파일이 올바르게 포함되지 않으면 발생.
  5. 클래스명/네임스페이스 변경
    • 프로젝트 리팩토링 후 네임스페이스나 어셈블리 이름이 바뀌었는데, 리소스 접근 코드가 예전 것을 참조하는 경우.

✅ 해결 방법

  1. 리소스 이름 확인
    • Visual Studio에서 .resx 파일을 선택하고 속성(F4) → 빌드 작업 = Embedded Resource (포함 리소스) 인지 확인.
    • 네임스페이스 + 파일명 확인.
      예: MyProject01.Properties.Resources.resx → MyProject01 .Properties.Resources
    1
    2
    var rm = new ResourceManager(" MyProject01 .Properties.Resources"typeof(Program).Assembly);
    string value = rm.GetString("Hello");
    cs
     
  2. 네임스페이스 동기화
    • .resx 파일의 네임스페이스가 실제 프로젝트 네임스페이스와 맞는지 확인.
    • 코드와 동일하게 수정.
  3. 빌드 후 DLL에 포함 여부 확인
    • 빌드된 DLL을 ILSpy, dotPeek 같은 도구로 열어서 리소스가 포함되어 있는지 확인.
    • 없다면 Embedded Resource 설정이 잘못된 것.
  4. 다국어 리소스 문제 해결
    • Resources.resx와 Resources.ko.resx 같은 파일이 같은 경로에 있는지 확인.
    • CultureInfo를 잘못 지정했는지도 확인.
     
    1
    2
    var culture = new CultureInfo("ko-KR");
    string value = rm.GetString("Hello", culture);
    cs
     
  5. 강제 지정 방법
    • 혹시 자동 생성 코드(Resources.Designer.cs)가 꼬였을 경우,
    • Project > Properties > Resources.resx 우클릭 > '사용자 지정 도구 실행' 클릭
    • 혹은, 직접 리소스 매니저 생성:
     
    1
    2
    ResourceManager rm = new ResourceManager("MyProject01.Properties.Resources", Assembly.GetExecutingAssembly());
    string msg = rm.GetString("HelloWorld");
    cs

 

728x90
반응형