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

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

Я намагаюся вставити деякі шаблони електронної пошти в aбібліотека класів. Це відмінно працює, поки я не використовую ім'я файлу, що містить ім'я culture з наступним позначенням: 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 мова.

Якщо ви перейдете до каталогу 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
}

Приклад файлу проекту тут.


0 для відповіді № 2

Ви впевнені, що маєте правильну назву дляResourceSet, коли ви відкриваєте ResourceStream? Якщо ManifestResources не є вашим простором імен проекту, а файл .cshtml - у кореневій теці, то ім'я resourceset, ймовірно, є недійсним.

Спосіб створення .NET проектів генерує ім'я resourceSet, яке використовується для відкриття потоку ресурсів, засноване на базовому просторі імен плюс ієрархію папок. Наприклад:

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

Найпростіший спосіб перевірити, чи можна побачитияк виглядає цей ресурс, це відкриття остаточної збірки (або збірки ресурсів) за допомогою інструментів, таких як Reflector / DotPeek, і побачити, що таке фактичний вбудований ресурс і ідентифікатори ресурсів.