MissingManifestResourceException은 무슨 뜻이고 어떻게 해결 하죠?


151

그 상황:

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

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

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

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


2
이것은 .NET에서 가장 도움이되지 않는 예외 중 하나입니다. 공통점이없는 적어도 3 개의 시나리오에서 트리거됩니다.
rr-

1
죄송하지만 Microsoft 방식입니다. 모두 제거하고 다시 추가하십시오 . 리소스, NUGET, 참조 및 연결 문자열에서 작동합니다. 이 도구를 많이 있습니다,하지만 당신은 ... 아닌 보통의 경우 원시 파일에 대한 시간을 보낸 것
maxkoryukov

답변:


238

이 문제를 해결하기 위해 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". 이 작업을 수동으로 수행했지만 사용자 지정 도구를 실행하면 동일하게 수행됩니다.


9
이로 인해 많은 시간이 절약되었습니다!
Eric

1
+1! VS 2010에서는 위에 표시된 ResourceManager 리터럴 문자열이 최소한 WinForms의 경우 프로젝트 속성 (응용 프로그램 탭)의 기본 네임 스페이스 값으로 자동 업데이트됩니다.
TrueWill

2
resources.resx 파일이 없으면 어떻게합니까?
ashes999

@ ashes999 : 속성 폴더를 보셨습니까? 그것이 적어도 C # 프로젝트를위한 곳입니다.
RenniePet

.resx 파일은 프로젝트에 수동으로 추가되었으며, "ResXFileCodeGenerator"로 설정 한 파일의 사용자 정의 도구 속성이 추가되었습니다. 나중에 .resx 파일. 내가 어떻게 그것을 만들 수 ....
Kavitha

37

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

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

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

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

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

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

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


답변 주셔서 감사합니다. 같은 증상을 일으킨 다른 문제가있는 것 같습니다. 코드에 추가 클래스가 없었으며 실제로 양식이 전혀 없었습니다. 자동 생성 코드를 실제로 수정할 필요가 없다는 것을 알게되었으므로 이전 답변을 편집해야합니다. 코드 생성기를 다시 실행할 수 있었고 자체적으로 수정되었을 것입니다. 빌드 프로세스가 자동으로 수행되지 않은 이유를 모르겠습니다.
Timwi

7
Form1.cs 파일의 Form 클래스 위에 클래스를 추가했기 때문에 오류가 발생했습니다 (제공 한 링크의 "해결 방법"섹션에 설명 된대로). 감사!
Matt Smith

같은 문제; 아무것도 작동하지 않았으므로 줄을 삭제했습니다. this.Icon = ((System.Drawing.Icon) (resources.GetObject ( "$ this.Icon")); 나는 그 특정 형태의 아이콘에 관심이 없기 때문에 :)
Gary Huckabone

그게 답입니다. 감사합니다.
Sertan Pekel

누군가 혼란 스러울 경우 Form1.cs의 "Form1"비트 앞에 "StringExtensions"라는 클래스가 있으면 위 대신 대신 form1.cs에서 Form1 아래로 이동하여 작동했습니다.
Ma Dude

31

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

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

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

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


12
이 "답변"을 게시 해 주셔서 감사합니다. OP의 문제와 관련하여 "주제를 벗어난"주제 임에도 불구하고 여기에 게시하는 것이 좋습니다. MissingManifestResourceException을 검색하면이 스레드로 연결되었으며 귀하의 답변은 제 문제에 대한 것입니다.
RenniePet

16

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

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

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

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


2
+1 덕분에 다른 응용 프로그램에서 참조하는 별도의 라이브러리에있는 리소스 파일을 다시 확인했습니다. Build Action을 Content로 설정하고 Embedded Resource로 변경 한 후 모두 제대로 작동했습니다. 바보 같은 감독
Shan Plourde

1
감사! 이것은 테스트 또는 비즈니스 매핑 규칙에 대한 내용이 들어있는 텍스트 파일이있는 곳에서 효과적이었습니다. 컨텐츠에서 임베디드 리소스로 변경하면 문제가 해결되었습니다.
S. Baggy

12

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

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

3

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'을 (를) 찾을 수 없습니다. "


약 8 시간이 문제를 디버깅하고 문자 그대로 모든 github, SO 및 Google 답변을 통해 트롤링 한 후 이것이 내 문제를 해결 한 대답입니다 ...
Neville

3

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

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

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

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

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

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

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


2
감사합니다! 정확히 내가 필요한 수정! 실수로 ViewModel 프로젝트를 제어 라이브러리로 생성 할 때 발생합니다.
Andrew Hanlon

감사합니다. 이것은 나를 위해 그것을 고쳤다.
Jamleck

2

그것이 사람들에게 도움이 될지 확실하지 않지만 이것은 나를 위해 일했습니다.

그래서 내가 가진 문제는 다음과 같은 메시지가 나타납니다.

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

다른 클래스 라이브러리에서 프로젝트에 포함 된 리소스를 얻으려고했습니다.

문제를 해결하기 위해 프로젝트-> 속성-> 리소스 탭의 액세스 수정자를 "내부"(같은 클래스 라이브러리 내에서만 액세스 가능)에서 "공용"(다른 클래스 라이브러리에서 액세스 가능)으로 설정했습니다.

그런 다음 실행하고 더 이상 오류가 없습니다 ...


2

BlaM이 제공 한 솔루션도 저에게 효과적이었습니다.

저는 VS 2013 사용자입니다. 많은 수정을했지만 운이없는 후에 나는 이것을 시도했다.

  1. 파일이 여러 개인 경우 리소스 파일을 하나씩 마우스 오른쪽 버튼으로 클릭하십시오.
  2. "빌드 조치"특성이 "내장 자원"으로 설정되어 있는지 확인하십시오.

그게 다야! :)


이것을 확인합니다. 작업중인 프로젝트가 있지만 리소스 어셈블리를 별도로 유지 관리해야했기 때문에 "내장 리소스"에서 단순히 "리소스"로 전환하여 MissingResourceManifestException이 발생했습니다.
Mosca Pt

2

나는 같은 문제가 있었지만 내 경우에는 이와 같이 usercontrol과 관련된 usercontrol에 클래스를 배치합니다.

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

해결책은 다음 MyUserControlObject과 같이 Usercontrol 클래스의 끝 으로 이동하는 것이 었습니다.

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

이게 도움이 되길 바란다


엉터리 오류 설명에 대해 이야기합니다 ... 메인 폼의 CS 파일에 도우미 클래스를 추가했습니다. 오류 메시지가 다시 연결될 것으로 추측하지는 않았습니다. 감사!
Adam Lewis

1

VS2005에서 VS2010으로 프로젝트를 이식 한 후 MissingManifestResourceException 오류가 발생했습니다. Form 클래스가 포함 된 파일에 다른 클래스가 정의되어 있지 않습니다. 또한 resx 리소스 파일 이름을 올바르게 설정했습니다. 작동하지 않았다.

그래서 resx 파일을 삭제하고 다시 생성했습니다. 이제 다 좋아


1

최근에 같은 문제가 발생하여 조금 어려움을 겪고이 주제를 찾았지만 대답이 맞지 않았습니다.

내 문제는 WPF 프로젝트에서 주 창을 제거했을 때 (주 창이 없음)에서 제거 StartupUri하는 것을 잊었다 는 것 App.xaml입니다. 난 당신의 실수가있는 경우이 예외가 발생할 수 추측 StartupUri사람이 고민하는 경우 때문에 경우에 - 당신의 확인 StartupUri에를 App.xaml.


1

최근이 문제에 걸려 넘어졌고 제 경우에는 몇 가지 일을했습니다.

  1. resx 파일의 Designer.cs 파일에서 네임 스페이스가 일치하는지 확인하십시오.

  2. 어셈블리의 기본 네임 스페이스 (프로젝트를 마우스 오른쪽 단추로 클릭하고 속성 선택)가 리소스 파일이있는 네임 스페이스와 동일하게 설정되어 있는지 확인하십시오.

2 단계를 수행하면 예외가 사라졌습니다.


1

Form에서 파생 된 클래스 바로 전에 파일에 다른 클래스를 추가했을 때이 문제가 발생했습니다. 문제를 해결 한 후 추가하십시오.


1

디자이너가 만든 폼 클래스의 소스 코드에 새 클래스를 넣을 때도 같은 오류가 발생할 수 있습니다.

이 새 클래스는 제거되어 다른 cs 파일에 배치 될 수 있습니다.

(적어도 내 경우에는 이것이 문제였습니다 ...)


0

VS2012 게시 기능을 사용하여 웹 응용 프로그램을 사전 컴파일하고 있기 때문입니다. 위의 오류가 발생했습니다. 나는 모든 제안을 시도했지만 '빌드 액션'을 '콘텐츠'로 이상하게 변경하면 트릭이되었습니다!


0

내 경우에는 리소스가있는 웹 API가 있고 그로부터 너겟 패키지를 만듭니다. 다른 프로젝트 에서이 nuget을 사용할 때 리소스가있는 api를 요청할 때 MissingManifestResourceException약간의 연구를 거친 후에 nuget packager가 자동으로 리소스를 포장하지 않는다는 것을 알게됩니다. 자원 파일을 사용하려면 수동으로 수행해야합니다. 따라서 .nuspec 파일에 아래 행을 추가해야합니다 ( https://github.com/NuGet/Home/issues/1482 방문 )

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

그러나 파일을 추가하기 전에 사용중인 .net 버전을 확인해야합니다.


0

새로 만든 F # 프로젝트와 함께했습니다. 해결책은 프로젝트 속성-> 응용 프로그램-> 자원 / 응용 프로그램 자원 관리 방법 지정에서 "표준 자원 이름 사용"을 선택 취소하는 것입니다. 확인란이 보이지 않으면 Visual Studio를 업데이트하십시오! 15.6.7이 설치되어 있습니다. 15.3.2에는이 확인란이 없습니다.


0

그냥 언급하면됩니다. 상수 또는 리터럴을 사용하는 ProjectName.Resources경우이 형식의 자원을 참조하고 cpntain이 아닌지 확인하십시오.Resources.resx .

한두 시간 절약 할 수 있습니다.


0

전역 네임 스페이스의 이름을 바꾼 후 (Win2017의 수동 이름이 아니라 VS2017의 이름 바꾸기 도구로) WinForms 기반의 관리되는 C ++ 프로젝트 에서이 문제가 발생했습니다.

해결책은 간단하지만 다른 곳에서는 언급되지 않았습니다.

RootNamespaceC ++ 네임 스페이스와 일치하도록 vcxproj-file의 항목 을 변경해야 합니다.


0

필자의 경우 Winforms Form에서 열린 창 Xaml의 오타였습니다.

잘못됨 : <Image Source="/Resources/WorkGreen.gif"/>

맞습니다 : <Image Source="../Resources/WorkGreen.gif"/> 누군가에게 도움이 될 수 있습니다


-3

에서 Microsoft 지원 페이지 :

부적절한 파일 이름을 가진 .resources 파일을 사용하여 만든 위성 어셈블리에있는 지역화 된 리소스를 사용하는 경우이 문제가 발생합니다. 이 문제는 일반적으로 위성 어셈블리를 수동으로 만드는 경우에 발생합니다.

이 문제를 해결하려면 Resgen.exe를 실행할 때 .resources 파일의 파일 이름을 지정하십시오. .resources 파일의 파일 이름을 지정하는 동안 파일 이름은 애플리케이션의 네임 스페이스 이름으로 시작해야합니다. 예를 들어 Microsoft Visual Studio .NET 명령 프롬프트에서 다음 명령을 실행하여 파일 이름 시작 부분에 응용 프로그램의 네임 스페이스 이름이있는 .resources 파일을 만듭니다.

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources

1
귀하의 답변에 감사드립니다.하지만 ResGen.exe가 무엇인지 모르겠습니다. 사용한 적이 없으며 솔직히 아무것도 사용하려고하지 않기 때문에 솔직히 사용하고 싶지 않습니다. 분명히 Visual Studio 에서이 문제를 해결할 수있는 방법이 있어야합니까? 예를 들어, 리소스가 "현지화"되었다고 말하면 어떻게 리소스를 지역화되지 않은 것으로 선언합니까? 다시 감사합니다.
Timwi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.