지정된 문화 또는 중립 문화에 적합한 자원을 찾을 수 없습니다


194

두 개의 ASP.NET 웹 프로젝트 (ProjectA 및 ProjectB)가 있습니다. ProjectA의 클래스가 Blah.resx 리소스 파일을 사용하는 ProjectB 클래스를 인스턴스화하는 경우이 오류가 발생합니다.

mscorlib.dll에서 'System.Resources.MissingManifestResourceException'유형의 예외가 발생했지만 사용자 코드에서 처리되지 않았습니다.

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

이 원인은 무엇입니까?

Microsoft 사이트에이 http://support.microsoft.com/kb/318603 에 관한 기사가 있습니다 .

이 문제를 해결하려면 다른 클래스 정의를 모두 이동하여 양식의 클래스 정의 뒤에 표시되도록하십시오.

이것은 Windows Forms 프로젝트를위한 솔루션이며, 이것이 웹 프로젝트에도 적용되는지 확실하지 않습니다.


이들은 어떤 유형의 프로젝트입니까? 2 개의 웹 사이트? 웹 사이트 1 개, 클래스 라이브러리 1 개?
— Ruddy

두 개의 ASP.NET 웹 사이트 프로젝트.
— dev.e.loper

11
+1 To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.이 문제를 해결했습니다.
— OmarOthman

1
Windows.Forms Project Microsoft 도움말 링크를 사용하여 질문 정의를 +1하면 문제가 해결되었습니다.
— DarrenMB

이 답변 은 나를 위해 문제를 해결했습니다! GetGlobalResourceObject
— DanielV

답변:


257

WPF 프로젝트에서 이와 동일한 예외가 발생했습니다. 문제는 우리가 최근에 다른 네임 스페이스 (이동한다는 어셈블리 내에서 발생 ProblemAssembly.Support하는 ProblemAssembly.Controls). 어셈블리에 존재하는 두 번째 리소스 파일에서 리소스에 액세스하려고 할 때 예외가 발생했습니다.

추가 리소스 파일이 이전 네임 스페이스 이름에서 새 네임 스페이스 이름으로 참조를 올바르게 이동하지 않았 음을 나타냅니다.

리소스 파일의 designer.cs에는 ResourceManager를 가져 오기위한 정적 속성이 있습니다. 해당 getter 내에서 문자열은 여전히 ​​이전 네임 스페이스를 참조하고있었습니다. 새로운 네임 스페이스로 수정하면 문제가 해결되었습니다.

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

이어야했다 :

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);

이것이 다음 사람에게 도움이되기를 바랍니다.


5
+1 디자이너 파일에서 원인을 찾을 수있는 위치에 대한 적절한 설명. 당신 덕분에 같은 문제를 발견하고
— 코딩 사라짐

1
링크 : ResourceManager 클래스에 대한 MSDN 설명서
— Boinst

3
이 문제를 해결하는 데 도움을 주셔서 감사합니다. 디자이너 파일을 삭제 한 다음 resx 파일을 열고 저장하여 디자이너 파일을 올바르게 재생성 할 수도 있습니다.
— Serge

1
나는 같은 문제가 있었고 이것이 내가 찾고있는 대답이었습니다. 슬프게도 컴파일 타임에 나타나지 않습니다 :-( Thanks
— noob

2
덕분 에이 문제도 있었지만 프로젝트 네임 스페이스의 마지막 부분과 동일한 이름의 하위 폴더를 추가했기 때문에 project.folder.class 대신 project.folder.folder.class를 찾고 있었기 때문입니다. 나는 그것을 루트로 옮겼고 이제 줄을 서서 작동합니다!
— SelAromDotNet

115

나는 다음과 같은 문제를 해결했다.

  1. ResourceFile을 마우스 오른쪽 버튼으로 클릭하십시오.
  2. "빌드 조치"특성 컴파일을 "내장 자원"으로 변경하십시오.
  3. 그런 다음 빌드하고 실행하십시오.

완벽하게 작동합니다.


@sibi Elango ResourceFile을 마우스 오른쪽 버튼으로 클릭하지만 Build Action 부분을 찾을 수 없습니다.
— S5498658

1
@ S5498658 컨텍스트 메뉴에 표시되지 않으면 (오른쪽 클릭) 속성 패널 (일반적으로 솔루션 탐색기 아래에 있음)을 확인하십시오.
— 정의

빌드 조치이지만 여전히 작동하지 않습니다. 또한 디렉토리와 디렉토리가 속성에서 동일하다는 것을 확인했습니다.
— albatross

1
답이이 솔루션의 작동 이유를 설명하면 좋을 것입니다.
— Luis Teijon

이것은 정말 대단합니다
— code4j

22

한 C # 프로젝트의 resource.resx 파일을 다른 C # 프로젝트와 공유하려고 할 때이 문제가 발생했습니다. Form 클래스를 파일의 시작 부분으로 옮기는 것에 대한 제안은 적절하지 않았습니다. 이것이 내가 해결 한 방법입니다. 기본적으로 두 번째 프로젝트에서 첫 번째 프로젝트로의 링크를 사용한 다음 resource.designer.cs파일을 재생성 할 수 있습니다.

  1. 두 번째 프로젝트 Properties/Resources.resx파일 삭제
  2. 첫 번째 프로젝트의 Properties/Resources.resx파일 을 두 번째 프로젝트 의 속성 폴더에 링크로 추가하십시오 . 프로젝트의 루트 레벨에 추가하지 마십시오.
  3. 첫 번째 프로젝트를 추가 하지 마십시오Properties/Resources.designer.cs !
  4. 두 번째 프로젝트의 속성 에서 CustomTool로 Resources.resx추가 ResXFileCodeGenerator하십시오.
  5. 을 마우스 오른쪽 버튼으로 클릭 Resources.resx하고 "사용자 정의 도구 실행"을 선택하십시오. 새 designer.cs 파일이 생성됩니다.

참고 : resource.designer.cs 파일은 자동 생성되므로 편집하지 마십시오.


12

필자의 경우 일련의 잘못 생각한 전역 텍스트 대체가 실수로 리소스 디자이너 cs 파일에서이 줄을 변경했습니다.

여기에 이미지 설명을 입력하십시오

해당 인수의 네임 스페이스가 더 이상 클래스의 네임 스페이스와 일치하지 않으므로 런타임시 애플리케이션이 혼란스러워졌습니다.

디자이너의 네임 스페이스가 해당 줄의 문자열 인수와 일치하는지 확인하십시오.


1
정확히 내 문제였다. 공유해 주셔서 감사합니다!
— AcidJunkie

여기서는 PCL에서 .NET Standard로 마이그레이션 한 후 임시 프로젝트와 네임 스페이스를 만들 때 모든 휴대용 파일을 복사하고 휴대용 프로젝트를 제거하고 네임 스페이스를 원래의 이름으로 되 돌렸을 때 발생했습니다.이 줄에는 여전히 임시가 포함되어 있습니다. 마이그레이션 프로세스의 네임 스페이스
— Zerga

11

이 *.resх마이그레이션에서 제외 되었기 때문에 발생 합니다.

  • ResourceFile을 마우스 오른쪽 버튼으로 클릭하십시오.
  • "프로젝트에 포함"메뉴 항목을 클릭하십시오

2
이것은 나를 위해 그것을 고쳤다. 일반적으로 resx 파일은 자동으로 추가됩니다. 프로젝트 파일을 변경하고 마이그레이션을 수동으로 추가해야하는 병합 작업을 수행
— 했으므로이

나를 위해 일했다. 각 마이그레이션의 모든 * .resx 파일을 추가해야합니다. 감사합니다
— m.rufca

7

프로젝트에서 resx 파일을 제외하고 designer.cs 파일을 삭제 한 다음 네임 스페이스 리팩터링 (CFinck의 답변에 따라)에 따라 종종 이러한 종류의 문제를 해결했습니다.


이것이 나를 위해 한 일입니다! (CFinck의 답변은 관련이있는 것처럼 보였지만 작동하지 않았습니다)
— winwaed

실제로 가장 빠른 솔루션 중 하나
— Lorenz Lo Sauer

6

아무도이 솔루션을 언급하지 않은 것 같습니다. 분명히-하지만 잠시 동안 저를 넘어 뜨 렸습니다 ...

새 리소스 파일의 기본 액세스 수정자는 Internal(또는 FriendVB.Net)입니다.Public

(resx 디자이너에는 액세스 수정 자 상단에 드롭 다운이 있습니다)


4

시비 엘랑 고스의 대답만으로는 충분하지 않았기 때문에

  • ResourceFile을 마우스 오른쪽 버튼으로 클릭하십시오.
  • "빌드 조치"특성 변경
  • "내장 리소스"로 컴파일
  • 구축 및 배포

이렇게하면 /bin폴더에 App_GlobalResources가 생성되고 해당 폴더를 웹 응용 프로그램의 루트에도 복사 합니다


4

필자의 경우 클래스를 잘못된 방식으로 정의하여 발생하는 문제는 다음과 같습니다.

namespace MyBuggyWorld
{
    public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
    {
        public TcpClient ActiveClient { get; set; }
        public BackgroundWorker ActiveWorker { get; set; }
    }
    public partial class FormMain : Form
    {
    }
}

BackendObject끝까지 재 할당 (파일 분리가 낫다) 한 후 프로젝트 정리 + 다시 작성을 수행하면 문제가 해결되었습니다.


1
와우, 나는 파일의 시작 부분에 잘못된 수업이 있다는 것이 너무 나쁘다는 것을 알지 못했습니다.
— BrainStorm.exe

4

리소스 파일이 저장된 프로젝트로 이동하여 ItemGroup으로 스크롤하고 컴파일러가 예상 한 경로에 해당하는 논리적 이름을 추가 하여이 문제를 해결했습니다.

내 EmbeddedResource는 다음과 같습니다.

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

이제 이렇게 생겼어요

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

3

이 경우 리소스를 포함하는 어셈블리에 기본 네임 스페이스가 동일한 텍스트로 설정되어 있는지 확인하십시오 (Project-> Properties-> Default 네임 스페이스; VS에서) resx 파일에 BuildEction 속성이 "Embedded"로 설정되어 있는지 확인하십시오. 자원 "즐기십시오 ...;)


1
안녕하세요, 기본 네임 스페이스 (xxx) 텍스트가 코드에서와 동일해야한다는 것을 의미합니까? Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
— DanielV

2

한 가지 방법은 공유 클래스 / 리소스를 별도의 클래스 라이브러리 프로젝트에 넣고 두 웹 사이트 모두에서 참조하는 것입니다.


2
확실히 이것은 같은 문제입니까, 그렇지 않습니까?
— Brett Rigby

2

감사합니다 @CFinck! 다른 사람들에게 팁을 추가하기 위해 : ResourceManager 줄을 다음과 같이 변경했습니다.

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

나는 vb.net에 있지만 C #에서는 유일한 차이는 & 대신 &를 연결하여 문자열을 연결한다고 생각합니다.

이렇게하면 리소스를 공유하는 두 개의 유사한 프로젝트에서 동일한 링크 된 어셈블리 파일을 사용할 수 있습니다.


1

resx 디자이너 파일은 리플렉션에 의존하기 때문에이 오류는 Dotfuscation에서도 발생합니다. Dotfuscator를 사용하는 경우 resx 파일이 손상됩니다. 난독 처리 프로세스에서 항상 제외로 추가해야합니다.


1

우리가 사용할 때

HttpContext.GetGlobalResourceObject()

try / catch 문 안에 해당 호출을 래핑하지 않으면 해당 오류가 발생합니다.


1

솔루션에 단일 프로젝트가있는 WinForms 응용 프로그램이 있습니다. 내 IDE로 사용하여
타겟팅.NET Framework 4.0
SharpDevelop 4.3

바보처럼 들리지만 파일 에 Logical Name속성을 설정했습니다 . 일단 그 속성을 지우면 모든 것이 엉뚱한 작품입니다."Resources""Resources.resx"

일반적으로으로 임의의 파일을 추가 할 때 EmbeddedResource일반적 Logical Name으로을 합리적인 것으로 설정하려고합니다. 어떤 이유로 든 Resources.resx파일 에서 동일한 작업을 수행하여 파일을 망쳤습니다.

이것이 누군가를 돕기를 바랍니다.


나는 이것도 가지고있는 것처럼 보였다. 이름이 충돌하는 것 같아요!
— Trent

1

나에게 문제는 .resx 파일과 관련 .cs 파일을 한 프로젝트에서 다른 프로젝트로 복사하는 것이 었습니다. 두 프로젝트 모두 동일한 네임 스페이스를 가지므로 문제가되지 않았습니다.

마지막으로 솔루션 탐색기에서 원래 프로젝트에서 .resx 파일이 .cs 파일에 의존한다는 것을 알았을 때 해결했습니다.

MyResource.cs
|_ MyResource.resx

복사 된 프로젝트에서 .cs 파일은 .resx 파일에 종속되었습니다.

MyResource.resx
|_ MyResource.cs

두 번째 프로젝트에서는 .resx 파일이 .cs 파일을 자동 생성하도록 설정되어 있음이 밝혀졌습니다. 자동 생성 된 .cs 파일이 원래 프로젝트에서 복사 한 .cs 파일을 덮어 쓰고있었습니다.

문제를 해결하려면 복사 한 프로젝트에서 각 .resx 파일의 속성을 편집하십시오. 사용자 지정 도구 속성은 같은 설정됩니다 ResXFileCodeGenerator . .resx 파일 의 사용자 정의 도구 특성을 지우십시오. 자동 생성 된 파일로 덮어 쓰기 때문에 원본 프로젝트에서 .cs 파일을 다시 복사해야합니다.


1

필자의 경우 동일한 파일 내에서 Windows 폼 위에 새 클래스를 배치했습니다.

새로 추가 된 클래스를 해당 파일에서 옮기면 문제가 해결되었습니다.

여기를 참조하십시오 : http://i.stack.imgur.com/wVu6c.png


1
Stackoverflow에 오신 것을 환영합니다! 공유 할 코드가 있으면 이미지로 게시하지 마십시오. 게시물에 추가하고 코드 형식으로 지정할 수 있습니다 .
— FelixSFD

제안 해 주셔서 감사합니다 @FelixSFD
— Petre

1

일치하지 않는 네임 스페이스로 인해 발생할 수 있습니다. 두 번째 상단 답변 (Sibi Elango 's)은 ​​resx 파일을 마우스 오른쪽 버튼으로 클릭하고 빌드 옵션을 EmbeddedResource로 변경한다고 말했지만 이미 완료했지만 여전히 오류가 발생했습니다. 최고 답변 (CFinck 's)은 ​​수동으로 파일을 편집 하여이 문제를 해결하는 방법에 주목하지만 MonoDevelop 에서이 문제가 있었고 기본 네임 스페이스를 리소스를 호출 한 cs 파일과 동일한 파일로 설정해야했습니다. 아래 코드와 같은 코드 포함) ...

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

GUI를 통해 기본 네임 스페이스를 설정 한 후 위의 행에서 더 이상 예외가 발생하지 않았습니다.


1

또 다른 경우입니다. 두 개의 프로젝트가있는 솔루션을 복사하고 Windows 탐색기 (폴더 이름, .sln 및 .csproj 파일 이름)에서 부분적으로 이름을 바꾸고 Visual Studio (이름 공간 등)에서 대규모 찾기 및 바꾸기 작업으로 부분적으로 이름을 바꿨습니다. 그럼에도 불구하고 OP에 명시된 예외는 여전히 발생했습니다. 어셈블리 및 네임 스페이스 이름 이 여전히 오래된 것을 알았습니다 .

프로젝트 및 다른 모든 이미 이름이되었지만 OfficeStyleAssembly name 와 Default namespace여전히 지명되었다 Linckus을 .

오래된 상황

이 수정 후 모든 것이 다시 정상적으로 작동하고 컴파일 및 실행 시간 :)

새로운 상황


0

필자의 경우 다음 코드 줄이 추가되어 Web.config많은 도움이 되었습니다 .

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

빌드 조치 : Embedded Resource및 사용자 정의 도구 :와 함께 PublicResXFileCodeGenerator.


0

응용 프로그램 섹션의 두 번 클릭 속성 에서 어셈블리 이름 과 기본 네임 스페이스 가 같은지 확인하십시오.


0

나는 또한 같은 문제에 직면하고 답변에 언급 된 모든 솔루션을 시도했지만 아무것도 작동하지 않는 것 같습니다. TFS에 코드를 체크인하는 동안 그 결과가 나타났습니다. TFS가 디자이너 파일에서만 체크인 한 Resx 파일을 체크인하지 않았습니다. 따라서 다른 모든 개발자는 컴퓨터에서 실행하는 동안이 문제에 직면했습니다. resx 파일을 수동으로 체크인하면 트릭을 수행했습니다.


"체크인"이란 무슨 뜻입니까?
— Fandango68

파일을 TFS로 푸시
— Kayani

0

클래스를 기본 winform 클래스 (예 : Form1) 위에 놓을 때 발생할 수도 있습니다. 디자인이 렌더링되지 않아서 디자인을 볼 때이를 확인할 수 있습니다.


0

또 다른 원인 : 네임 스페이스에 하이픈 ( "-")이 있으면 올바르게 빌드되고 실행되지만 리소스에 액세스 할 수 없습니다. 네임 스페이스 (식별자)에는 하이픈이 없어야하지만 리소스를로드하는 것 외에는 적용되지 않는 것으로 보입니다. 이로 인해 10 년 동안 두 번이나 화상을 입었습니다.


0

확인해야 할 또 다른 사항은 EmbeddedResource에 LogicalName 또는 ManifestResourceName이 정의되어 있는지 여부입니다. 자원이 예상치 못한 이름으로 존재할 수 있으므로 프로젝트 파일에서 사용중인 경우 해당 파일이 올바르게 정의되어 있는지 확인하십시오.


0

마이그레이션 명령을 실행하는 데이 문제가 발생했습니다. Update-Database패키지 관리자 콘솔에서.

수락 된 답변으로 문제가 해결되지 않았습니다.

나는 Build Action을에서로 변경 Compile해야 Embedded Resource했고 그것은 나를 위해 일했다.

아래 단계를 사용하여 동일한 작업을 수행 할 수 있습니다.

  1. 마이그레이션을 마우스 오른쪽 버튼으로 클릭하십시오.
  2. "빌드 조치"특성 "컴파일"을 "내장 자원"으로 변경하십시오.
  3. Update-Database 명령을 실행하십시오.

0

.NET Core 3.0에서이 문제에 직면 한 사용자의 경우 이는 .NET Core 3.0에서 변경된 주요 변경 사항 과 관련되어 EmbeddedResourceUseDependentUponConvention프로젝트 csproj에서 false로 설정 되어 해결됩니다 .

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>

0

리소스를 마우스 오른쪽 버튼으로 클릭하고 Run Custom Tool

이것은 디자이너를 해결합니다


-1

프로젝트 B의 DLL을 참조한다고해서 프로젝트 A의 리소스 관리자가 프로젝트 B의 App_GlobalResources 디렉토리를 알고 있다는 의미는 아닙니다.

웹 사이트 프로젝트 또는 웹 응용 프로그램 프로젝트를 사용하고 있습니까? 후자에서 Visual Studio를 사용하면 소스 코드 파일 을 연결할 수 있습니다 (전 파일에 대해서는 잘 모르겠습니다). 이것은 알지 못하지만 유용한 기능이며 여기 에 설명되어 있습니다 . 이렇게하면 프로젝트 B 리소스 파일을 프로젝트 A에 연결할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.