2013-08-07 23 views
5

Próbuję osadzić niektóre szablony wiadomości e-mail w bibliotece klas. Działa to dobrze, dopóki nie użyję nazwy pliku zawierającej nazwę kultury z następującym oznaczeniem: templatename.nl-NL.cshtml Zasób nie jest dostępny.Osadzone zasoby w zestawie zawierające nazwę kultury w nazwie pliku nie zostaną załadowane.

Przykładowy kod:

namespace ManifestResources 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var assembly = Assembly.GetExecutingAssembly(); 

      // Works fine 
      var mailTemplate = assembly.GetManifestResourceStream("ManifestResources.mailtemplate.cshtml"); 

      // Not ok, localized mail template is null 
      var localizedMailTemplate = assembly.GetManifestResourceStream("ManifestResources.mailtemplate.nl-NL.cshtml"); 
     } 
    } 
} 

Szablony oba mają budować akcję ustawioną na 'EmbeddedResource'.

Oczywistym rozwiązaniem jest użycie innej notacji, ale podoba mi się ta notacja. Ktoś ma rozwiązanie tego problemu?

+1

I repro. Będziesz musiał zadowolić się kolejną konwencją nazewnictwa, aby uniknąć walki z zapiekanym systemem montażu satelitów. Wystarczy pominięcie okresu sprzed nazwy kultury lub zastąpienie jej myślnikiem. –

Odpowiedz

0

Czy na pewno masz poprawną nazwę dla ResourceSet po otwarciu ResourceStream? O ile ManifestResources nie jest Twoim podstawowym obszarem nazw projektu, a plik .cshtml znajduje się w folderze głównym, prawdopodobnie nazwa zestawu zasobów jest nieprawidłowa.

Sposób, w jaki projekty .NET generują nazwę zasobu, której używa się do otwarcia strumienia zasobów, opiera się na podstawowej przestrzeni nazw oraz hierarchii folderów. Na przykład:

baseNamespaceOfProject.Views.Controller.YourPage.nl-NL.cshtml

Najprostszym sposobem sprawdzenia, upewnij się, można zobaczyć, co zasób wygląda to otworzyć doborowe (lub zestawu zasobów) za pomocą narzędzia takiego jak Reflector/DotPeek i zobacz, co są rzeczywistymi osadzonymi zestawami zasobów i zasobami.

2

Mam nadzieję, że nie spóźnię się z odpowiedzią.

Po dodaniu templatename.nl-NL.cshtml jako zasobu osadzonego, ląduje on w zestawie satelitarnym z zasobami dla języka nl-NL.

Jeśli przejdziesz do katalogu bin/debugowania, znajdziesz w nim folder nl-NL z NAMESPACE.resources.dll.

satellite assembly directory

satellite assembly name

Jeśli dekompilować tego zespołu, znajdziesz templatename.cshtml plik wewnątrz.

enter image description here

Aby ją przeczytać, trzeba uzyskać ten zespół i odczytać z niego zasobów.

Aby dostać, trzeba wykonać ten kod:

var mainAssembly = AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "ConsoleApp2"); 

ConsoleApp2 było nazw gdzie miałem wszystkie moje zasoby. Powyższy kod zostanie zgromadzony tylko wtedy, gdy jest już załadowany. Zakładałem, że tak.

Następnie musisz zainstalować satelitę.To jest główna różnica między standardowym pliku czytania z osadzonego zasobu:

var satelliteAssembly = mainAssembly.GetSatelliteAssembly(CultureInfo.CreateSpecificCulture("nl-NL")); 

A potem mamy standardową metodę można odczytać pliku zasobu:

var resourceName = "ConsoleApp2.templatename.cshtml"; 

using (Stream stream = satelliteAssembly.GetManifestResourceStream(resourceName)) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     string result = reader.ReadToEnd(); // nl-NL template 
    } 

Przykładowy plik projektu here.

+0

Lepiej późno niż wcale nie powiedziałbym :) +1 na teraz, dopóki nie będę mógł sprawdzić, czy działa. Thanx! –