2013-08-07 9 views
5

Sto tentando di incorporare alcuni modelli di email in una libreria di classi. Funziona bene, fino a quando non utilizzo un nome file contenente un nome-cultura con la seguente notazione: templatename.nl-NL.cshtml La risorsa non sembra essere disponibile.Le risorse incorporate nell'assembly contenente il nome cultura nel nome file non verranno caricate

codice Esempio:

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"); 
     } 
    } 
} 

Modelli entrambi hanno a costruire l'azione impostata su 'EmbeddedResource'.

La soluzione ovvia è usare una notazione diversa, ma mi piace questa notazione. Qualcuno ha una soluzione per questo problema?

+1

I repro. Dovrai accontentarti di un'altra convenzione di denominazione per evitare di combattere il supporto dell'assemblaggio satellitare al forno. Basta omettere il periodo precedente al nome della cultura o sostituirlo con un trattino è sufficiente. –

risposta

0

Sei sicuro di avere il nome giusto per il ResourceSet quando apri il ResourceStream? A meno che ManifestResources sia lo spazio dei nomi di base del progetto e il file .cshtml risieda nella cartella radice, il nome del gruppo di risorse probabilmente non è valido.

Il modo in cui i progetti .NET generano il nome del resourceSet che si utilizza per aprire il flusso di risorse si basa sul namespace di base più la gerarchia di cartelle. Per esempio:

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

Il modo più semplice per controllare assicurarsi che potete vedere quali sembra la risorsa come è quello di aprire l'assemblaggio finale (o assieme risorse) con uno strumento come Reflector/DotPeek e vedere quali sono gli ID delle risorse e delle risorse incorporate reali.

2

Spero di non essere in ritardo con la risposta.

Quando si aggiunge templatename.nl-NL.cshtml come risorsa incorporata, atterra nell'assieme satellite con risorse per la lingua nl-NL.

Se si accede alla directory bin/debug, nella cartella nl-NL è presente la cartella NAMESPACE.resources.dll.

satellite assembly directory

satellite assembly name

Se decompilare questa assemblea, troverete templatename.cshtml di file al suo interno.

enter image description here

Per leggerlo, è necessario ottenere questa assemblea e leggere delle risorse da esso.

Per farlo, è necessario eseguire questo codice:

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

ConsoleApp2 era namespace dove ho avuto tutte le mie risorse. Il codice sopra verrà assemblato solo se è già caricato. Ho pensato che lo fosse.

Quindi è necessario ottenere il montaggio satellitare.Questa è la differenza principale tra la lettura di file standard da risorsa incorporata:

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

E poi abbiamo metodo standard per leggere file di risorse:

var resourceName = "ConsoleApp2.templatename.cshtml"; 

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

Esempio file di progetto here.

+0

Meglio tardi che mai direi :) +1 per ora fino a quando posso verificare che funzioni. Grazie! –