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