Опитвам се да вградя някои шаблони за имейл в aклас библиотека. Това работи добре, докато не използвам име на файл, съдържащо име на култура със следното означение: 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".
Очевидно решение е да използвате различна нотация, но аз харесвам тази нотация. Всеки има решение за този проблем?
Отговори:
2 за отговор № 1Надявам се, че не съм закъснял с отговор.
Когато добавите templatename.nl-NL.cshtml
като вграден ресурс, той се приземява в сателитен монтаж с ресурси за nl-NL
език.
Ако отидете в директорията за директории, ще намерите 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
}
Примерна файл на проекта тук.
0 за отговор № 2
Сигурен ли сте, че имате правилното име заResourceSet, когато отворите ResourceStream? Освен ако ManifestResources не е вашето проектно базово пространство за имена и файлът .cshtml живее в основната папка, която име на ресурси е вероятно невалидно.
Начинът, по който .NET проектите генерират resourceSet името, което използвате за отваряне на потока ресурси, се базира на базовото пространство на имената плюс йерархията на папките. Например:
baseNamespaceOfProject.Views.Controller.YourPage.nl-NL.cshtml
Най-лесният начин да проверите, уверете се, че можете да видитетова, което изглежда ресурсът, е да отворите крайния монтаж (или ресурсен монтаж) с инструмент като Reflector / DotPeek и да видим какви са действителните вградени resourcesSet и Resource IDs.