/ / Embedded ресурси в монтаж, съдържащи име на култура в името на файла няма да се зареди - c #, локализация, вграден ресурс

Вградените ресурси в монтаж, съдържащи име на култура в името на файла, няма да се заредят - c #, локализация, вграден ресурс

Опитвам се да вградя някои шаблони за имейл в 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.