2013-07-15 2 views
0

a previous question에서 언급했듯이 프로그램 수명 기간 동안 변경되지 않지만 문자열 목록에 대한 비싼 작업을 통해서만 얻을 수있는 문자열 리소스 집합이 있습니다. 이 파일은 다음에 복사 컴파일C# 응용 프로그램에서 지역화되지 않은 리소스를 사용할 수 없습니다.

StatesUS=A(LA(SK|BAM)A|RKANSAS)|B..... 
Countries=UNITED (STATES|KINGDOM)|CA(NAD|MBODI)A..... 

: 성능을 개선하기위한 시도에서

public static class Patterns 
{  
    Public static readonly string StateUS = 
     @"\b(?<STATE>" + CharTree.GenerateRegex(FixedLists.StateUS) + @")\b"; 

    Public static readonly string Countries = 
     @"\b(?<STATE>" + CharTree.GenerateRegex(FixedLists.Countries) + @")\b"; 

    //..... 
} 

, 나는 파일에서 목록을 읽고 리소스 파일 Regex.restext를 출력 T4와 원하는 캐릭터를 생성 한 타 rget 디렉토리의 빌드 후 :

cd $(ProjectDir) 
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\resgen.exe" /compile Regex.restext 
copy /Y Regex.resources "$(TargetDir)MyProject.Resources.Lists.resources" 

하지만 Patterns의 정적 생성자 내에서 이러한 값을로드 할 때 :

ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("MyProject.Resources.Lists", @".\", null); 
StateUS = rm.GetString("StateUS") 

를 내가받을 다음과 같은 오류 :

InnerException: System.Resources.MissingManifestResourceException 
Message=Could not find any resources appropriate for the specified culture (or the neutral culture) on disk. 
System.Resources.FileBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 

그러나 이것은 문화 중립적 인 프로젝트입니다. 자원은 단지 저장을위한 것입니다. 그렇다면 왜 내가 문화를 지정해야 할 필요가 있을까요? 어떻게/어떻게하면 좋을까요?

그리고 내 리소스를로드하는 데 잘못된 방법을 사용하고 있다면 더 좋은 방법은 무엇입니까?

+0

정적 인 경우 한 번 생성 한 다음 복사하여 소스 코드에 붙여 넣으십시오. –

+0

기본 목록은 소프트웨어 버전간에 상당히 자주 변경되기 때문에. – Arithmomaniac

답변

1

이 예외는 MyProject.Resources.Lists.resources 파일을 찾을 수 없음을 나타냅니다. 어쩌면 파일 경로 나 파일 이름 자체가 틀립니다. 예제 응용 프로그램을 작성하여 예제를 검증하고 정상적으로 작동합니다.

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location으로 대체하여 리소스 파일에 올바른 위치를 사용하고 있는지 확인해야합니다. 응용 프로그램 내부에 Directory.SetCurrentDirectory("D:\\");을 설정하는 경우 @".\"이 자원을 찾습니다.

+0

예 ... 다른 폴더에서 실행중인 테스트 탐색기에서 NUnit 테스트를 실행하고있었습니다. 따라서 컴파일 후 복사에 의존하는 것은 효과가 없을 것입니다. – Arithmomaniac