Підключення ресурсів у Visual Studio .NET

Підключення ресурсів у Visual Studio .NET

Переклад статті Using Resources in Visual Studio .NET від Dejan Jelovic

У Visual Studio .NET здається досить дивна система додавання та управління такими ресурсами як растрові зображення та локалізовані рядки. Воно працює не завжди, воно нелогічне, інструменти управління вельми бідні і, нарешті, воно погано задокументоване.

Цей документ і посібник допоможе привести все до ладу.

Концепція

Ось чому все виходить не так як треба:

У Visual Studio .NET багато ресурсів вже не зберігаються у .RC файлах. Замість цього редактор форм напряму маніпулює вашим VB чи C# кодом коли вам треба щось візуально відредагувати.

Але нам дійсно все ще потрібні інші типи ресурсів. Нам потрібні графічні ресурси такі як растрові зображення та іконки так само як і залежні від локалі рядки. Вони зазвичай зберігаються в одному чи багатьох .RESX файлах, які входять у проект Visual Studio.

Таким чином щоб використовувати ці ресурси у вашому програмному коді вам необхідно знати як:

  • Створити RESX файли.
  • Додавати зображення та інші типи ресурсів до RESX файлу.
  • Завантажити ресурс у вашому коді.

Отож, почнемо…

Створення RESX файлу

Visual Studio .NET зберігає ресурси типу растрових зображень, іконок та локалізованих рядків у файлах з розширенням .RESX. Насправді ці файли є звичайними XML файлами в яких всі бінарні ресурси кодуються в BASE64.

Коли ви компілюєте проект, то компілятор перетворює ці файли в бінарні з розширенням .resource, а потім лінковщик підключає їх у результуючий файл EXE чи DLL.

Додати новий RESX файл в проект елементарно: просто клацніть правою кнопкою миші на проекті в “Solution Explorer”, оберіть “Add/Add New Resource” і додайте новий “Assembly Resource File”.

Додавання ресурсів до RESX файлу

А отут починаються веселощі: у Visual Studio не передбачено ніяких засобів для візуального редагування ресурсів у файлі RESX. На щастя, Лютц Роедер (Lutz Roeder) створив інструмент під назвою Resourcer який можна використовувати для їх редагування.

Щоб додати растрове зображення до RESX файлу:

Запустіть Resourcer.2. Відкрийте у Resourcer’і ті RESX файли які ви додали до проекту Visual Studio.
3. Виберіть “Add”/”Add File”.
4. Коли з’явиться ділог, введіть ім’я файлу з растровим зображенням і символічне ім’я під яким його вміст буде збережено у файлі RESX. Після натискання на кнопку “ОК”, вміст файлу буде закодовано у BASE64 і розміщено в RESX під іменем, яке ви обрали.
5. Збережіть файл RESX вибравши “File”/”Save”.

От і все. До речі, вам більш не треба тримати власне сам файл растрвого зображення, оскільки в RESX файлі зберігається його повноцінна копія.

Використання ресурсів з вашого програмного коду

А ось так треба завантажувати ресурс під час виконання програми:

По-перше, вам потрібно знати під яким іменем Visual Studio помістило цей ресурс у результуючому EXE файлі. Кожен проект Visual Studio має простір імен, який з ним асоційований.

Кожен проект Visual Studio має асоційоване з ним ім’я простору імен (даруйте за тавтологію). Клацнувши двічі на файлі проекту в Solution Explorer, а потім вибравши пункт Properties ви побачите діалог, який дозволить обрати “Простір імен по замовчуванню” (“Default Namespace”). Visual Studio додасть всі ресурси в результуючий EXE-файл під іменем, яке утворюється з імені по замовчуванню та іменем RESX файлу.

Нехай ваш простір імен по замовчуванню називається MyCompany.MyProject, а RESX-файл називається SomeResources. Тоді ці ресурси знаходитимуться у результуючому виконуваному файлі під іменем MyCompany.MyProject.SomeResources.

Щоб отримати доступ до ресурсів з вашого коду вам потрібно буде створити екземпляр ResourceManager:

ResourceManager resourceManager = new ResourceManager ("MyCompany.MyProject.SomeResources", GetType ().Assembly);

Потім щоб отримати растрове зображення ви використовуватимете символічне ім’я, яке ви вказали, коли додавали його до файлу RESX використовуючи Resourcer:

Bitmap image = (Bitmap)resourceManager.GetObject ("MyBitmapName");

Якщо ви спробуєте створити менеджер ресурсів використовуючи неправильне ім’я, або ви ввели неправильне ім’я коли викликали ResourceManager.GetObject, то фреймворк викине MissingManifestResourceException.

От і все. Насолоджуйтесь

Додаток

Я щойно отримав листа від Яна Гріффіта (Ian Griffiths). Він пише, що є простіший спосіб зберігати незалежні від локалі ресурси (зазвичай іконки та бітмапки) в проекті. Просто додайте їх до проекту як і будь-який інший файл, а потім виставте їх Build Action в Embedded Resource.

Хоча їх завантаження все одно буде нетривіальним. Нехай ви хочете завантажити растрове зображення. Найпростіший спосіб – це використати конструктор класу Bitmap в формі:

Bitmap (Type type, string resource);

Перший параметр – це тип, що “володіє” ресурсом, а другий – це власне ім’я ресурсу.

А ось тепер починається нетривіальність: завантажувач ресурсів намагається завантажити ресурс з іменем, яке складається з імені простору імен до якого відноситься параметр type та власне імені ресурсу. Таким чином якщо ви всередині методу класу MyCompany.MyProject.MySubProject.MyClass спробуєте завантажити ресурс з іменем MyBitmap.bmp виконавши:

Bitmap bitmap = new Bitmap (GetType (), "MyBitmap.bmp");

То завантажувач ресурсів спробує завантажити його як ресурс з іменем MyCompany.MyProject.MySubProject.MyBitmap.bmp.

Як же зберегти ресурс під таким іменем? Ім’я ресурсу в маніфесті формується з імені простору імен по замовчуванню та імені файлу. Таким чином якщо ваш простір імен по замовчуванню називається MyCompany.MyProject то вам залишається лише назвати файл з бітмапкою MySubProject.MyBitmap.bmp.

Лінк на оригінал: http://jelovic.com/articles/resources_in_visual_studio.htm

Sergii Gulenok

Sergii Gulenok

View Comments