2013-08-07 13 views
5

私はクラスライブラリにいくつかの電子メールテンプレートを埋め込もうとしています。これは、次の表記法でculture-nameを含むファイル名を使用するまで有効です。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

I repro。 baked-inサテライトアセンブリのサポートとの戦いを避けるために、別の命名規則に準拠する必要があります。文化の名前の前の期間を省略するか、ダッシュで置き換えるだけで十分です。 –

答えて

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と言います。ありがとう! –

関連する問題