2013-08-07 21 views
5

我試圖在類庫中嵌入一些電子郵件模板。這工作正常,直到我使用包含具有以下符號的文化名稱的文件名:templatename.nl-NL.cshtml 該資源似乎不可用。在文件名中包含文化名稱的程序集中的嵌入式資源不會加載

示例代碼:

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

模板都具有生成操作設置爲 'EmbeddedResource'。

明顯的解決方案是使用不同的表示法,但我喜歡這種表示法。任何人都有解決這個問題的方法?

+1

我重播。你將不得不解決另一個命名慣例,以避免與舊式衛星裝配支持作鬥爭。只是省略文化名稱之前的時間或用短劃線替換它就足夠了。 –

回答

0

當您打開ResourceStream時,確定您擁有ResourceSet的正確名稱嗎?除非ManifestResources是您的項目基名稱空間,並且.cshtml文件位於資源集名稱可能無效的根文件夾中。

.NET項目生成resourceSet名稱用於打開資源流的方式基於基本名稱空間和文件夾層次結構。例如:

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

檢查做最簡單的方式,以確保您可以看到資源的樣子是打開最後組裝(或資源組裝)使用Reflector/DotPeek這樣的工具,看看實際的嵌入式資源集和資源ID是什麼。

2

我希望我沒有遲到的答案。

當您將templatename.nl-NL.cshtml添加爲嵌入式資源時,它會以具有nl-NL語言的資源登錄到衛星程序集。

如果你進入bin/debug目錄,你會發現nl-NL文件夾中有NAMESPACE.resources.dll

satellite assembly directory

satellite assembly name

如果您編譯該組件中,你會發現裏面templatename.cshtml文件。

enter image description here

要閱讀它,你必須讓本次大會並從中讀取資源。

爲了得到它,你必須執行此代碼:

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

ConsoleApp2是命名空間,我有我的所有資源。上面的代碼只有在已經加載的情況下才會獲得程序集。我認爲它是。

然後,你必須得到衛星組裝。這是從嵌入的資源閱讀標準的文件之間的主要區別是:

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

然後我們有標準的方法來讀取資源文件:

var resourceName = "ConsoleApp2.templatename.cshtml"; 

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

示例項目文件here

+0

遲到比晚上好,我會說:)現在+1,直到我可以驗證它的作品。感謝名單! –

相關問題