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


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 nameDefault 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.