我正在尝试在类库中嵌入一些电子邮件模板。这很好用,直到我使用包含带有以下表示法的文化名称的文件名: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”。
明显的解决方案是使用不同的表示法,但我喜欢这种表示法。任何人都有解决这个问题的方法吗?
答案 0 :(得分: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
}
示例项目文件here。
答案 1 :(得分:0)
打开ResourceStream时,您确定您具有正确的ResourceSet名称吗?除非ManifestResources是您的项目基名称空间,并且.cshtml文件位于根文件夹中,资源集名称可能无效。
.NET项目生成用于打开资源流的resourceSet名称的方式基于基本命名空间和文件夹层次结构。例如:
baseNamespaceOfProject.Views.Controller.YourPage.nl-NL.cshtml
最简单的检查方法是确保您可以看到资源的样子是使用Reflector / DotPeek等工具打开最终的程序集(或资源程序集),看看实际的嵌入式资源集和资源ID是什么。