gpt4 book ai didi

c# - 文件名中包含区域性名称的程序集中的嵌入式资源将不会加载

转载 作者:太空狗 更新时间:2023-10-29 21:45:08 24 4
gpt4 key购买 nike

我正在尝试将一些电子邮件模板嵌入到类库中。这工作正常,直到我使用包含具有以下符号的区域性名称的文件名: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 是我拥有所有资源的 namespace 。上面的代码只有在已经加载的情况下才会得到程序集。我以为是。

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

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 .

关于c# - 文件名中包含区域性名称的程序集中的嵌入式资源将不会加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com