2013-08-07 14 views
5

Bir sınıf kitaplığına bazı e-posta şablonları yerleştirmeye çalışıyorum. Bu, aşağıdaki notasyona sahip bir kültür adı içeren bir dosya adı kullanana kadar iyi çalışır: templatename.nl-NL.cshtml Kaynak mevcut görünmüyor.Dosya adında kültür adı içeren derleme içindeki yerleşik kaynaklar yüklenmez

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

Şablonlar 'EmbeddedResource' ayarlanmış bir işlem oluşturmak sahiptir.

Belli bir çözüm, farklı bir gösterim kullanmaktır, ancak bu gösterimi beğeniyorum. Bu problem için herkesin bir çözümü var mı?

+1

Ben repro. Pişmiş uydu montaj desteğiyle mücadele etmemek için başka bir adlandırma sözleşmesi yapmak zorunda kalacaksınız. Sadece kültür adından önceki süreyi atlamak ya da bir çizgi ile değiştirmek yeterlidir. –

cevap

0

ResourceSphere'i açtığınızda ResourceSet için doğru ada sahip olduğunuzdan emin misiniz? ManifestResources, proje taban ad alanınız ve .cshtml dosyasının kök kaynak klasöründe, kaynak adının büyük olasılıkla geçersiz olduğu durumlar dışında.

.NET projelerinin kaynak akışını açmak için kullandığınız resourceSet adını oluşturma yolu, temel ad alanına ve klasör hiyerarşisine dayanır. Örneğin: son montaj (veya kaynak montaj) açmaktır gibi

baseNamespaceOfProject.Views.Controller.YourPage.nl-NL.cshtml yapmak kontrol etmenin en kolay yolu, emin kaynak benzediğini görebilirsiniz Reflektör/DotPeek gibi bir araç ile gerçek gömülü resourceSet ve Kaynak Ids ne olduğunu görmek.

2

Umarız cevap vermeyeceğim.

Katıştırılmış kaynak olarak templatename.nl-NL.cshtml eklediğinizde, nl-NL dili için kaynaklarla birlikte uydu aksamına gelir.

Kutuya/hata ayıklama dizinine giderseniz,klasöründe NAMESPACE.resources.dll klasörünü bulacaksınız. Bu montaj koda olursa

satellite assembly name

satellite assembly directory, içeri templatename.cshtml dosyasını bulacaksınız.

enter image description here

okumak için, bu montaj almak ve ondan kaynak okumak zorunda.

almak için, bu kodu çalıştırmak zorunda:

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

ConsoleApp2 Ben bütün kaynaklara sahip ad oldu. Yukarıdaki kod yalnızca önceden yüklenmişse montaj alacaktır. Varsaydım. Uydu düzeneği almak zorundasınız.Bu gömülmüş kaynak okuma standart dosyası arasındaki temel fark şudur:

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

Sonra kaynak dosyasını okumak için standart bir yöntem vardır:

var resourceName = "ConsoleApp2.templatename.cshtml"; 

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

Örnek proje dosyasını here.

+0

Hiç geç olmamasından daha iyidir :) Ben bunu doğrulayabildiğim kadarıyla +1 çalışır. Thanx! –

İlgili konular