2013-01-18 13 views
6

Czy możliwe jest zachowanie logicznego układu pliku projektu?Jak są przechowywane ścieżki do zasobów osadzonych?

Jeśli mam 2 wbudowane zasoby określonymi jak na poniższym

Embedded Resources

Kiedy zadzwonić Assembly.GetManifestResourceNames(), dwóch z nich nazywa się:

  • MyLibrary._MyItems. SubItems.SubItem1.xml
  • MyLibrary._MyItems.SubItems.SubItem2.xml

To jednak nie daje mi prawdziwego wglądu w to, jak są logicznie uporządkowane w moim projekcie. Z tego, co wiem, oboje mogli być w tym samym katalogu.

Martwię się, że to może nie być możliwe, ponieważ jeśli nazwać pliki jak tak, moja aplikacja nie będzie nawet skompilować:

Embedded Resources

Chcę być w stanie odróżnić

  • MyLibrary._MyItems \ podpunktach \ SubItem1.xml
  • i
  • MyLibrary._MyItems \ SubItems.SubItem2.xml

Similar question, but less detail than I am looking for

Exact duplicate, no traction

+1

Zrzut ekranu pokazuje tylko miejsce przechowywania oryginalnych plików zasobów na * dysku *. Co nie ma nic wspólnego z przechowywaniem wewnątrz * zespołu * po zbudowaniu programu. Wewnątrz zespołu nie ma żadnej struktury katalogów. –

+0

Chociaż może nie mieć nic wspólnego z _where_, są one przechowywane w zespole, to oczywiście ma to pewien wpływ na _how_ są przechowywane. Czy masz referencję do swojego stwierdzenia, o którym mogę przeczytać więcej? – Michael

+0

Pierwsza "MojaLibrary" jest domyślną przestrzenią nazw projektu, reszta to zwykle foldery. Dopóki znasz domyślny obszar nazw lub jesteś w stanie go znaleźć, powinieneś być w stanie określić strukturę folderów ... chyba że ktoś zdecyduje się zbudować swój zespół za pomocą niestandardowego procesu kompilacji, a nie VS –

Odpowiedz

0

Prostym rozwiązaniem byłoby wymyślić konwencji, aby wskazać, gdzie rozpoczyna się nazwa pliku. Można wtedy "bezpiecznie" założyć, że reszta nazwy wskazuje na strukturę folderów.

Jednak ponieważ są to zasoby osadzone, można utworzyć skrypt T4 (lub podobny fragment kodu), który działa przed kompilacją, który sprawdza strukturę folderów i buduje klasę opisującą tę strukturę.

Oto przykład tego, jak może wyglądać wygenerowana klasa.

public static class MyResources 
{ 
    private readonly Dictionary<String, String> ResourceNameToDirPathMappingSetSource = new Dictionary<String, String>(); 

    static MyResources() 
    { 
     ResourceNameToPathMappingSetSource.Add("MyLibrary._MyItems.SubItems.SubItem1.xml", @"MyLibrary._MyItems\SubItems"); 
     ResourceNameToPathMappingSetSource.Add("MyLibrary._MyItems.SubItems.SubItem2.xml", @"MyLibrary._MyItems"); 
    } 

    public static IReadOnlyDictionary<String, String> ResourceNameToDirPathMappingSet 
    { 
     get 
     { 
      return ResourceNameToDirPathMappingSetSource; 
     } 
    } 
} 

Moje założenie jest, że chcesz mieć nazwę zasobu i określić ścieżkę folderu to było pierwotnie w słowniku oczywiście może zawierać cokolwiek wartości (czytaj: niestandardową klasę). Trzeba mapować.

Powiązane problemy