2014-11-11 1 views
1

주어진 .NET 어셈블리의 모든 문자열 리소스를 반복하고 싶습니다.다른 어셈블리에서 문자열 리소스 반복하기

주어진 문화 또는 중립 문화 ManifestResourceException 누락 : GetResourceSet 항상 예외를 throw합니다,

public void IterateResourcesInAssembly(string filename) 
{ 
    var assembly = Assembly.LoadFile(filename); 
    string[] resourceNames = assembly.GetManifestResourceNames(); 

    foreach (var resourceName in resourceNames) 
    { 
    var resourceManager = new ResourceManager(resourceName, assembly); 
    var resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true); 
    // Exception is thrown! 
    } 
} 

문제 여기에 있습니다 : 이렇게하려면 그래서 나는 다음과 같은 코드를 함께했다 리소스를 찾을 수 없습니다 ...

하지만 그건 사실이 아닙니다. 어셈블리에는 영어와 독일어로 된 많은 리소스가 포함되어 있습니다. .NET 반사경을 사용하여 어셈블리를 열면 해당 리소스도 볼 수 있습니다.

+0

InternalGetResourceSet 메서드를 사용해 보셨습니까? 나는 그 방법을 대신 사용하는 것을 막연하게 기억한다. 만나다. http://msdn.microsoft.com/en-us/library/system.resources.resourcemanager.internalgetresourceset%28v=vs.110%29.aspx. GetNeutralResourcesLanguage를 먼저 호출하여 전달해야하는 CultureInfo를 얻을 수도 있습니다. – stevethethread

답변

3

GetManifestResourceNames() 메서드는 확장명이있는 리소스 이름을 반환합니다. 자원 관리자 인스턴스를 작성하기 전에 자원 이름에서 확장자를 제거하고 자원 기본 이름 만 전달해야합니다.

public void IterateResourcesInAssembly(string filename) 
     { 
      var assembly = Assembly.LoadFile(filename); 
      string[] resourceNames = assembly.GetManifestResourceNames(); 

      foreach (var resourceName in resourceNames) 
      { 
       string baseName = Path.GetFileNameWithoutExtension(resourceName); 
       ResourceManager resourceManager = new ResourceManager(baseName, assembly); 

       var resourceSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true); 
       // Exception is thrown! 
      } 
     } 
+0

이것은 매우 잘 작동합니다. 그러나 하나의 문제가 있습니다 : 어떤 문화권 이건 'GetResourceSet'에 전달되던간에, 나는 항상 기본 (영어) 리소스를 얻습니다. 어떻게 고정 될 수 있었습니까? '새로운 CultureInfo ("de")'는 나에게 현지화 된 독일어 리소스를 제공 할 것입니까? – Boris

+0

현지화 된 리소스가 도입되면 지역화 된 버전을 저장하기 위해 별도의 위성 어셈블리가 만들어지기 때문입니다. 예를 들어, 독일어 지역화 된 파일이있는 경우 별도 폴더가 bin 폴더에 "de-DE"로 만들어지고 위성 어셈블리가 생성됩니다. 난 당신이 지역화 된 리소스가없는 메인 DLL을로드하는 것으로 가정합니다. 다음 링크에는 어셈블리 경로를 동적으로 작성하는 방법에 대한 예제가 들어 있습니다. http://stackoverflow.com/questions/5246584/c-sharp-cannot-getting-a-string-from-resourcemanager-from-satellite-assembly – dcp1986

+0

실제로! 고맙습니다. – Boris

관련 문제