6

我正在尝试在类库中嵌入一些电子邮件模板。这工作正常,直到我使用包含具有以下符号的文化名称的文件名: 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”。

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

4

2 回答 2

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

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
    }

示例项目文件在这里

于 2017-12-27T11:12:46.123 回答
0

打开 ResourceStream 时,您确定 ResourceSet 的名称正确吗?除非 ManifestResources 是您的项目基础命名空间并且 .cshtml 文件位于根文件夹中,否则资源集名称可能无效。

.NET 项目生成用于打开资源流的资源集名称的方式基于基本命名空间和文件夹层次结构。例如:

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

检查以确保您可以看到资源外观的最简单方法是使用 Reflector/DotPeek 之类的工具打开最终程序集(或资源程序集),然后查看实际嵌入的资源集和资源 ID 是什么。

于 2015-03-19T00:10:03.260 回答