将不加载包含文件名的文件名中的嵌入式资源

Rob*_*aap 6 c# localization embedded-resource

我正在尝试在类库中嵌入一些电子邮件模板.这很好用,直到我使用包含带有以下表示法的文化名称的文件名: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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

模板都将构建操作设置为"EmbeddedResource".

明显的解决方案是使用不同的表示法,但我喜欢这种表示法.任何人都有解决这个问题的方法吗?

Luk*_*Led 4

我希望我的回答没有迟到。

当您添加templatename.nl-NL.cshtml为嵌入式资源时,它会与语言资源一起进入附属程序集中nl-NL

如果你进入 bin/debug 目录,你会发现其中nl-NL有 文件夹。NAMESPACE.resources.dll

卫星装配目录

卫星组件名称

如果你反编译这个程序集,你会在里面找到templatename.cshtml文件。

在此输入图像描述

要阅读它,您必须获取该程序集并从中读取资源。

要获得它,您必须执行以下代码:

var mainAssembly = AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "ConsoleApp2");
Run Code Online (Sandbox Code Playgroud)

ConsoleApp2是我拥有所有资源的命名空间。上面的代码只有在已经加载的情况下才会获得程序集。我以为是的。

然后你必须组装卫星。这是从嵌入式资源读取标准文件之间的主要区别

var satelliteAssembly = mainAssembly.GetSatelliteAssembly(CultureInfo.CreateSpecificCulture("nl-NL"));
Run Code Online (Sandbox Code Playgroud)

然后我们有标准的方法来读取资源文件:

var resourceName = "ConsoleApp2.templatename.cshtml";

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

示例项目文件在这里