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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将不加载包含文件名的文件名中的嵌入式资源相关的知识,希望对你有一定的参考价值。

我正在尝试在类库中嵌入一些电子邮件模板。这很好用,直到我使用包含带有以下表示法的文化名称的文件名: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”。

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

答案

我希望我的回答不迟。

当您将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

另一答案

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

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

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

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

以上是关于将不加载包含文件名的文件名中的嵌入式资源的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式加载嵌入式资源文件

文件包含include和require区别

从 Saxon 9.4he 中的嵌入式资源加载 xml 和 xslt

枚举嵌入资源目录中的文件

qrc资源文件加载后,裸机环境下图片不显示

使用 AppDomain 将 DLL 作为嵌入式资源文件加载