2010-03-25 6 views
11

리소스 또는 콘텐츠 빌드 작업을 사용하여 빌드 된 이미지 파일이있는 리소스 어셈블리가 있습니다. 이렇게하면 Uris를 사용하여 이러한 파일에 액세스 할 수 있습니다. 그러나 나는 그러한 자원을 열거 할 길을 찾을 수 없다.
내가 포함 리소스에 빌드 작업을 설정하면 다음과 같은 코드를 사용하여 파일을 열거 할 수있다 :런타임에 .NET 어셈블리 리소스 열거

string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

을하지만 결과적으로 이러한 파일은 URI를 사용하여 액세스 할 수 있습니다.

질문입니다 - 어떻게 자원 또는 내용 빌드 작업 중 하나를 컴파일하는 자원을 열거 할?

참고 : Thomas Levesque가 지적했듯이 AssemblyAssociatedContentFileAttribute를 활용하여 이러한 리소스를 열거 할 수 있지만 WPF 응용 프로그램 어셈블리에서만 작동하며 클래스 라이브러리에서는 작동하지 않는 것으로 보입니다. 그래서 질문은 아직 열려 있습니다.

답변

24

당신은 어셈블리에 정의 된 AssemblyAssociatedContentFile 속성을 열거 할 수 있습니다 : 당신은 또한 BAML 자원을 열거하는 방법을 this page을 확인할 수 있습니다

var resourceUris = Assembly.GetEntryAssembly() 
        .GetCustomAttributes(typeof(AssemblyAssociatedContentFileAttribute), true) 
        .Cast<AssemblyAssociatedContentFileAttribute>() 
        .Select(attr => new Uri(attr.RelativeContentFilePath)); 

.


업데이트 : 실제로 위의 솔루션은 콘텐츠 파일에만 적용됩니다. 이 메서드는 BAML 리소스, 이미지 등을 포함한 모든 리소스 이름을 반환합니다.

public static string[] GetResourceNames() 
    { 
     var asm = Assembly.GetEntryAssembly(); 
     string resName = asm.GetName().Name + ".g.resources"; 
     using (var stream = asm.GetManifestResourceStream(resName)) 
     using (var reader = new System.Resources.ResourceReader(stream)) 
     { 
      return reader.Cast<DictionaryEntry>().Select(entry => (string)entry.Key).ToArray(); 
     } 
    } 
+0

이것은 어셈블리에 이러한 특성이 설정된 경우에만 작동합니다. WPF 응용 프로그램은 * Content * 빌드 작업으로 작성된 파일에 대해서만 자동으로 설정됩니다. ClassLibrary 어셈블리의 경우에는 그러한 속성이 없습니다. 심지어 어셈블리 코드 내에서도 이러한 리소스를 열거 할 방법을 찾을 수 없습니다. –

+0

업데이트 코드는 원래의 질문에 답하지만 여전히 보편적 인 해결책은 아닙니다 :) 클래스 라이브러리의 경우 * Content *, * Resource * 및 * Embedded Resource * 빌드 작업으로 빌드 된 모든 리소스가 열거됩니다. 그러나 WPF 응용 프로그램의 경우 * Embedded Resource * 빌드 작업으로 빌드 된 리소스 만 열거합니다. WPF App의 모든 리소스를 열거하려면 위의 두 가지 방법의 조합이 필요합니다. –

+0

반환 값을 필터링 할 필요없이이 코드를 특정 폴더에서 직접 가져올 수 있습니까? (솔루션 탐색기에서 볼 수있는 몇 가지 리소스 폴더가 있는데 그 중 하나에로드하려는 이미지가 포함되어 있습니다.) – ziyuang