[C#] MissingManifestResourceException은 무슨 뜻이고 어떻게 해결 하죠?

그 상황:

  • 라는 클래스 라이브러리가 RT.Servers있습니다 (유형의 리소스가 몇 개 포함되어 byte[]있지만 중요하지 않다고 생각합니다)
  • 동일한 클래스 라이브러리에는 해당 자원 중 하나를 리턴하는 메소드가 포함되어 있습니다.
  • 해당 단일 메소드 만 호출하는 간단한 프로그램 (해당 라이브러리 참조)이 있습니다.

내가 얻을 MissingManifestResourceException다음과 같은 메시지가 :

지정된 문화 또는 중립 문화에 적합한 자원을 찾을 수 없습니다. 컴파일 할 때 “Servers.Resources.resources”가 어셈블리 “RT.Servers”에 올바르게 임베드되거나 링크되었는지 또는 필요한 모든 위성 어셈블리가로드 가능하고 완전히 서명되었는지 확인하십시오.

나는 문화 나 어셈블리 서명을 가지고 놀지 않았으므로 여기서 무슨 일이 일어나고 있는지 모르겠습니다. 또한 이것은 동일한 라이브러리를 사용하는 다른 프로젝트에서 작동합니다. 어떤 아이디어?



답변

이 문제를 해결하기 위해 Resources.resx솔루션 탐색기에서 파일 을 마우스 오른쪽 단추로 클릭하고 사용자 지정 도구 실행을 클릭하기 만하면 됩니다. 이것은 자동 생성 된 재생성Resources.Designer.cs 파일 됩니다.

.resx 파일을 프로젝트에 수동으로 추가 한 경우 파일의 사용자 정의 도구 특성을 “ResXFileCodeGenerator”로 설정해야합니다.

프로젝트 설정에서 어셈블리의 “기본 네임 스페이스”를 변경하면 네임 스페이스가 일치하지 않기 때문에 문제가 발생합니다. ((이전) "Servers"에서 (현재)로 변경했습니다."RT.Servers" .)

의 자동 생성 코드 Resources.Designer.cs에는 다음 코드가 있습니다.

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

리터럴 문자열 "Servers.Resources"을로 변경해야했습니다 "RT.Servers.Resources". 이 작업을 수동으로 수행했지만 사용자 지정 도구를 실행하면 동일하게 수행됩니다.


답변

방금 오늘이 문제가 발생 했으며 실제로이 문제를 해결하는 이 Microsoft 도움말 및 지원 페이지 를 찾았습니다 .

내 파일 맨 위에 전역 네임 스페이스에 몇 명의 대의원이 있었으며 MissingManifestResourceException프로그램을 실행할 때 갑자기이 줄에 도착했습니다 .

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

그런 다음 대리자를 네임 스페이스로 옮겼는데 같은 오류가 발생했습니다. 마지막으로 델리게이트를 해당 파일의 유일한 클래스에 넣었고 오류가 사라졌지 만 해당 클래스 또는 네임 스페이스의 델리게이트를 원하지 않았습니다.

그런 다음 위의 링크를 보았습니다.

이 문제를 해결하려면 다른 모든 클래스 정의를 폼의 클래스 정의 뒤에 나타나도록 이동하십시오.

로컬 네임 스페이스 외부에서 해당 파일의 맨 아래에 “클래스 정의”를 고려하지 않는 델리게이트를 추가했는데 프로그램이 MissingManifestResourceException더 이상 얻지 못했습니다 . 짜증나는 오류입니다. 그러나 자동 생성 코드를 수정하는 것보다 더 강력한 솔루션처럼 보입니다. 🙂


답변

비슷한 문제가 발생했지만 OP가 원인이 아니라는 것을 알고 있지만 나중에 다른 사람 이이 문제를 겪을 경우 답변을 얻을 수 있도록 여기에 게시합니다.

디자이너 클래스 앞에 클래스를 추가하면 MissingManifestResourceException런타임에 예외 가 발생합니다 (컴파일 시간 오류 또는 경고 없음).

Visual Studio에서는 디자이너가 파일의 첫 번째 클래스를 사용해야합니다.

자세한 내용은 이 게시물을 참조하십시오 .


답변

나는 같은 문제가 있었지만 Timwi제안한 대로 사용자 정의 도구 실행 명령을 사용하면 도움이되지 않습니다.

나는에 결국 때문에 그것은 올바른 방향으로 나를 이끌어 속성된 .resx 파일. 여기서 문제가없는 다른 .resx 파일과 의 차이점을 발견했습니다 .

제 경우에는 “Build Action”속성을 “Resource”에서 “Embedded Resource”로 변경해야했습니다.

이유에 대한 가장 좋은 추측 은 다른 응용 프로그램에서 사용 된 라이브러리에 .resx 가 있다는 것 입니다. 내 응용 프로그램에는 자체 .resx 파일이 없으므로 라이브러리의 파일을 사용해야했습니다. 라이브러리에 포함되어 있고 “독립”상태가 아닌 경우에만 사용할 수 있습니다.


답변

비슷한 문제로 Vs 2012에서 실행하면 resx 파일의 “Custom Tool Namespace”속성이 잘못되었습니다 (제 경우에는 실제로 설정되지 않았으므로 생성 된 코드는 런타임 에이 예외를 무시합니다) . resx 파일의 최종 속성 세트는 다음과 같습니다.

  • 빌드 조치 : 임베디드 자원
  • 출력 디렉토리로 복사 : 복사하지 마십시오
  • 사용자 정의 도구 : ResXFileCodeGenerator
  • 사용자 지정 도구 네임 스페이스 : My.Project.S.Proper.Namespace

답변

MSBuild로 빌드 한 후 테스트를 실행할 때 MissingManifestResourceException 참조 (.mresource에 매니페스트에 경로가 있음)

나는 완전성을 위해 여기에 답을 반복합니다.

프로젝트 파일에 LogicalName을 추가하면 수정됩니다.

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

즉, 프로젝트 파일에 포함 된 리소스 항목은 다음과 같습니다.

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName>
  </EmbeddedResource>
</ItemGroup>

자세한 내용은 http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx에 나와 있습니다.

우리는 .resx 파일을 사용하고 있지만 버그는 여전히 발생하는 것으로 보입니다.

업데이트 : 리소스 문제 (XAML 포함)는 출력 경로 및 슬래시 사용과 관련이있는 것으로 보입니다.
프로젝트 출력 디렉토리를 수정하는 이유 : IOException이 처리되지 않았습니다. “리소스 ‘app.xaml’을 (를) 찾을 수 없습니다. “


답변

resx 파일과 관련이없는이 문제의 다른 원인이 발생했습니다. AssemblyInfo.cs에 다음이 포함 된 클래스 라이브러리가있었습니다.

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

어셈블리에 WPF 코드, 테마 또는 리소스 사전이 포함되어 있지 않습니다. ThemeInfo 속성을 제거하여 예외를 제거했습니다.

나는 실제 예외를 얻지 못했습니다.

‘System.Resources.MissingManifestResourceException’유형의 첫 번째 예외입니다.

예외 세부 정보를보고 시스템에서 MyAssembly.g.resources를 요청했습니다.

이것이 다른 누군가에게 도움이되기를 바랍니다.