Извлечение ресурсов в приложениях .NET
При работе с локализованными ресурсами в приложениях .NET желательно упаковывать ресурсы для нейтральной или стандартной комбинации языка и региональных параметров в основную сборку и создавать отдельную вспомогательную сборку для каждого языка или каждой комбинации языка и региональных параметров, поддерживаемых вашим приложением. Затем можно использовать класс ResourceManager для доступа к именованным ресурсам, как описано в следующем разделе. Если вы решили не внедрять ресурсы в основную и вспомогательные сборки, можно обратиться к двоичным файлам RESOURCES напрямую, как описано в разделе Извлечение ресурсов из файлов RESOURCES далее в этой статье.
Извлечение ресурсов из сборок
Класс ResourceManager предоставляет доступ к ресурсам во время выполнения. Вы можете использовать метод ResourceManager.GetString для извлечения строковых ресурсов и метод ResourceManager.GetObject или ResourceManager.GetStream для извлечения нестроковых ресурсов. Каждый метод имеет две перегрузки:
- Перегрузка, единственным параметром которой является строка с именем ресурса. Метод пытается извлечь этот ресурс для языка и региональных параметров текущей культуры. Дополнительные сведения см. в описании методов GetString(String), GetObject(String)и GetStream(String) .
- Перегрузка, имеющая два параметра: строка с именем ресурса, а также объект CultureInfo , представляющий язык и региональные параметры, для которых требуется извлечь ресурс. Если не удается найти набор ресурсов для данной комбинации языка и региональных параметров, диспетчер ресурсов использует резервные правила для получения соответствующего ресурса. Дополнительные сведения см. в описании методов GetString(String, CultureInfo), GetObject(String, CultureInfo)и GetStream(String, CultureInfo) .
Диспетчер ресурсов использует процесс резервных ресурсов, чтобы управлять тем, как приложение извлекает ресурсы, связанные с языком и региональными параметрами. Дополнительные сведения см. в разделе «Процесс использования резервных ресурсов» в статье Упаковка и развертывание ресурсов. Сведения о создании экземпляра объекта ResourceManager см. в разделе «Создание экземпляров объекта ResourceManager» статьи о классе ResourceManager .
Пример извлечения строковых данных
В следующем примере вызывается метод GetString(String) для извлечения строковых ресурсов текущего языка и региональных параметров пользовательского интерфейса. Он включает нейтральный строковый ресурс для английского языка (США) и локализованные ресурсы для французского (Франция) и русского (Россия) языков и соответствующих региональных параметров. Следующий ресурс для английского языка (США) находится в файле Strings.txt:
TimeHeader=The current time is
Ресурс для французского языка (Франция) находится в файле Strings.fr-FR.txt:
TimeHeader=L'heure actuelle est
Ресурс для русского языка (Россия) находится в файле Strings.ru-RU-txt:
TimeHeader=Текущее время —
Исходный код этого примера, находящийся в файле GetString.cs для версии C# и GetString.vb для версии Visual Basic, определяет строковый массив, содержащий имя четырех комбинаций языков и региональных параметров: три комбинации, для которых доступны ресурсы, а также комбинацию для испанского языка (Испания). Цикл, который выполняется пять раз, случайным образом выбирает одну из этих комбинаций языков и региональных параметров и присваивает ее свойствам Thread.CurrentCulture и CultureInfo.CurrentUICulture . Затем он вызывает метод GetString(String) для извлечения локализованной строки, которая отображается вместе с временем дня.
using System; using System.Globalization; using System.Resources; using System.Threading; [assembly: NeutralResourcesLanguageAttribute("en-US")] public class Example < public static void Main() < string[] cultureNames = < "en-US", "fr-FR", "ru-RU", "es-ES" >; Random rnd = new Random(); ResourceManager rm = new ResourceManager("Strings", typeof(Example).Assembly); for (int ctr = 0; ctr ", culture.NativeName); string timeString = rm.GetString("TimeHeader"); Console.WriteLine(" \n", timeString, DateTime.Now); > > > // The example displays output like the following: // Current culture: English (United States) // The current time is 9:34:18 AM // // Current culture: Español (España, alfabetización internacional) // The current time is 9:34:18 // // Current culture: русский (Россия) // Текущее время — 9:34:18 // // Current culture: français (France) // L'heure actuelle est 09:34:18 // // Current culture: русский (Россия) // Текущее время — 9:34:18
Imports System.Globalization Imports System.Resources Imports System.Threading Module Example Public Sub Main() Dim cultureNames() As String = Dim rnd As New Random() Dim rm As New ResourceManager("Strings", GetType(Example).Assembly) For ctr As Integer = 0 To cultureNames.Length Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length)) Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName) Thread.CurrentThread.CurrentCulture = culture Thread.CurrentThread.CurrentUICulture = culture Console.WriteLine("Current culture: ", culture.NativeName) Dim timeString As String = rm.GetString("TimeHeader") Console.WriteLine(" ", timeString, Date.Now) Console.WriteLine() Next End Sub End Module ' The example displays output similar to the following: ' Current culture: English (United States) ' The current time is 9:34:18 AM ' ' Current culture: Español (España, alfabetización internacional) ' The current time is 9:34:18 ' ' Current culture: русский (Россия) ' Текущее время — 9:34:18 ' ' Current culture: français (France) ' L'heure actuelle est 09:34:18 ' ' Current culture: русский (Россия) ' Текущее время — 9:34:18
Следующий пакетный файл (BAT) компилирует этот пример и создает вспомогательные сборки в соответствующих каталогах. Команды приведены для языка и компилятора C#. Для Visual Basic замените csc на vbc и GetString.cs на GetString.vb .
resgen strings.txt csc GetString.cs -resource:strings.resources resgen strings.fr-FR.txt md fr-FR al -embed:strings.fr-FR.resources -culture:fr-FR -out:fr-FR\GetString.resources.dll resgen strings.ru-RU.txt md ru-RU al -embed:strings.ru-RU.resources -culture:ru-RU -out:ru-RU\GetString.resources.dll
Если текущая комбинация языка и региональных параметров пользовательского интерфейса относится к испанскому языку (Испания), обратите внимание, что пример отображает ресурсы на английском языке, так как ресурсы для испанского языка недоступны, а в примере английский язык задан по умолчанию.
Пример извлечения данных объекта
Для извлечения данных объекта можно использовать методы GetObject и GetStream . Сюда входят типы-примитивы, сериализуемые объекты и объекты, хранящиеся в двоичном формате (например, изображения).
В следующем примере метод GetStream(String) используется для извлечения точечного рисунка, который используется на экране-заставке приложения. Следующий исходный код в файле с именем CreateResources.cs (для C#) или CreateResources.vb (для Visual Basic) создает файл RESX, содержащий сериализованное изображение. В этом случае изображение загружается из файла SplashScreen.jpg; имя файла можно изменить, чтобы использовать собственное изображение.
using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Resources; public class Example < public static void Main() < Bitmap bmp = new Bitmap(@".\SplashScreen.jpg"); MemoryStream imageStream = new MemoryStream(); bmp.Save(imageStream, ImageFormat.Jpeg); ResXResourceWriter writer = new ResXResourceWriter("AppResources.resx"); writer.AddResource("SplashScreen", imageStream); writer.Generate(); writer.Close(); >>
Imports System.Drawing Imports System.Drawing.Imaging Imports System.IO Imports System.Resources Module Example Public Sub Main() Dim bmp As New Bitmap(".\SplashScreen.jpg") Dim imageStream As New MemoryStream() bmp.Save(imageStream, ImageFormat.Jpeg) Dim writer As New ResXResourceWriter("AppResources.resx") writer.AddResource("SplashScreen", imageStream) writer.Generate() writer.Close() End Sub End Module
Следующий код извлекает ресурс и отображает изображение в элементе управления PictureBox .
using System; using System.Drawing; using System.IO; using System.Resources; using System.Windows.Forms; public class Example < public static void Main() < ResourceManager rm = new ResourceManager("AppResources", typeof(Example).Assembly); Bitmap screen = (Bitmap) Image.FromStream(rm.GetStream("SplashScreen")); Form frm = new Form(); frm.Size = new Size(300, 300); PictureBox pic = new PictureBox(); pic.Bounds = frm.RestoreBounds; pic.BorderStyle = BorderStyle.Fixed3D; pic.Image = screen; pic.SizeMode = PictureBoxSizeMode.StretchImage; frm.Controls.Add(pic); pic.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; frm.ShowDialog(); >>
Imports System.Drawing Imports System.IO Imports System.Resources Imports System.Windows.Forms Module Example Public Sub Main() Dim rm As New ResourceManager("AppResources", GetType(Example).Assembly) Dim screen As Bitmap = CType(Image.FromStream(rm.GetStream("SplashScreen")), Bitmap) Dim frm As New Form() frm.Size = new Size(300, 300) Dim pic As New PictureBox() pic.Bounds = frm.RestoreBounds pic.BorderStyle = BorderStyle.Fixed3D pic.Image = screen pic.SizeMode = PictureBoxSizeMode.StretchImage frm.Controls.Add(pic) pic.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right frm.ShowDialog() End Sub End Module
Для сборки примера на C# можно использовать приведенный ниже пакетный файл. Для Visual Basic замените csc на vbc , а также расширение файла исходного кода .cs на .vb .
csc CreateResources.cs CreateResources resgen AppResources.resx csc GetStream.cs -resource:AppResources.resources
В следующем примере для десериализации настраиваемого объекта используется метод ResourceManager.GetObject(String) . Пример включает файл исходного кода UIElements.cs (UIElements.vb для Visual Basic), который определяет следующую структуру с именем PersonTable . Эта структура предназначена для использования подпрограммой общего отображения таблиц, которая отображает локализованные имена для столбцов таблиц. Обратите внимание, что структура PersonTable помечена атрибутом SerializableAttribute .
using System; [Serializable] public struct PersonTable < public readonly int nColumns; public readonly string column1; public readonly string column2; public readonly string column3; public readonly int width1; public readonly int width2; public readonly int width3; public PersonTable(string column1, string column2, string column3, int width1, int width2, int width3) < this.column1 = column1; this.column2 = column2; this.column3 = column3; this.width1 = width1; this.width2 = width2; this.width3 = width3; this.nColumns = typeof(PersonTable).GetFields().Length / 2; >>
Public Structure PersonTable Public ReadOnly nColumns As Integer Public Readonly column1 As String Public ReadOnly column2 As String Public ReadOnly column3 As String Public ReadOnly width1 As Integer Public ReadOnly width2 As Integer Public ReadOnly width3 As Integer Public Sub New(column1 As String, column2 As String, column3 As String, width1 As Integer, width2 As Integer, width3 As Integer) Me.column1 = column1 Me.column2 = column2 Me.column3 = column3 Me.width1 = width1 Me.width2 = width2 Me.width3 = width3 Me.nColumns = Me.GetType().GetFields().Count \ 2 End Sub End Structure
Следующий код из файла CreateResources.cs (CreateResources.vb для Visual Basic) создает файл ресурсов XML с именем UIResources.resx, где хранится заголовок таблицы, и объект PersonTable , содержащий сведения о приложении, локализуемые для английского языка.
using System; using System.Resources; public class CreateResource < public static void Main() < PersonTable table = new PersonTable("Name", "Employee Number", "Age", 30, 18, 5); ResXResourceWriter rr = new ResXResourceWriter(@".\UIResources.resx"); rr.AddResource("TableName", "Employees of Acme Corporation"); rr.AddResource("Employees", table); rr.Generate(); rr.Close(); >>
Imports System.Resources Module CreateResource Public Sub Main() Dim table As New PersonTable("Name", "Employee Number", "Age", 30, 18, 5) Dim rr As New ResXResourceWriter(".\UIResources.resx") rr.AddResource("TableName", "Employees of Acme Corporation") rr.AddResource("Employees", table) rr.Generate() rr.Close() End Sub End Module
После этого приведенный ниже код из файла GetObject.cs (GetObject.vb) извлекает ресурсы и выводит их на консоль.
using System; using System.Resources; [assembly: NeutralResourcesLanguageAttribute("en")] public class Example < public static void Main() < string fmtString = String.Empty; ResourceManager rm = new ResourceManager("UIResources", typeof(Example).Assembly); string title = rm.GetString("TableName"); PersonTable tableInfo = (PersonTable) rm.GetObject("Employees"); if (! String.IsNullOrEmpty(title)) < fmtString = ""; Console.WriteLine(fmtString, title); Console.WriteLine(); > for (int ctr = 1; ctr "; Console.Write(fmtString, value); > Console.WriteLine(); > >
Imports System.Resources Module Example Public Sub Main() Dim fmtString As String = String.Empty Dim rm As New ResourceManager("UIResources", GetType(Example).Assembly) Dim title As String = rm.GetString("TableName") Dim tableInfo As PersonTable = DirectCast(rm.GetObject("Employees"), PersonTable) If Not String.IsNullOrEmpty(title) Then fmtString = "" Console.WriteLine(fmtString, title) Console.WriteLine() End If For ctr As Integer = 1 To tableInfo.nColumns Dim columnName As String = "column" + ctr.ToString() Dim widthName As String = "width" + ctr.ToString() Dim value As String = CStr(tableInfo.GetType().GetField(columnName).GetValue(tableInfo)) Dim width As Integer = CInt(tableInfo.GetType().GetField(widthName).GetValue(tableInfo)) fmtString = "" Console.Write(fmtString, value) Next Console.WriteLine() End Sub End Module
Создать нужный файл ресурсов, сборки и запустить приложение можно, запустив следующий пакетный файл. Необходимо использовать параметр /r , чтобы предоставить Resgen.exe ссылку на UIElements.dll для доступа к информации о структуре PersonTable . Если используется C#, замените имя компилятора vbc на csc и расширение .vb на .cs .
vbc -t:library UIElements.vb vbc CreateResources.vb -r:UIElements.dll CreateResources resgen UIResources.resx -r:UIElements.dll vbc GetObject.vb -r:UIElements.dll -resource:UIResources.resources GetObject.exe
Поддержка версий для вспомогательных сборок
По умолчанию, когда объект ResourceManager извлекает запрошенные ресурсы, он ищет вспомогательные сборки с номерами версий, совпадающими с номером версии основной сборки. После развертывания приложения может потребоваться обновить основную сборку или вспомогательные сборки для конкретного ресурса. Платформа .NET Framework обеспечивает поддержку управления версиями как для основной, так и для вспомогательных сборок.
Атрибут SatelliteContractVersionAttribute обеспечивает поддержку управления версиями для сборки main. Указание этого атрибута для основной сборки приложения позволяет обновить и заново развернуть основную сборку без обновления ее вспомогательных сборок. После обновления основной сборки следует увеличить номер версии основной сборки, а номер версии вспомогательной сборки следует оставить без изменений. Когда диспетчер ресурсов извлекает запрошенные ресурсы, он загружает версию вспомогательной сборки, заданную этим атрибутом.
Сборки политик издателя обеспечивают поддержку управления версиями для вспомогательных сборок. Вы можете обновить и заново развернуть вспомогательную сборку без обновления основной сборки. После обновления вспомогательной сборки следует увеличить номер ее версии и доставить ее с помощью сборки политики издателя. В сборке политики издателя укажите, что новая вспомогательная сборка совместима с предыдущей версией. Диспетчер ресурсов будет использовать атрибут SatelliteContractVersionAttribute , чтобы определить версию вспомогательной сборки, но загрузчик сборок будет привязан к версии вспомогательной сборки, указанной в политике издателя. Дополнительные сведения о сборках политик издателей см. в разделе Создание файла политики издателя.
Чтобы включить полную поддержку управления версиями сборок, рекомендуется развернуть сборки со строгими именами в глобальном кэше сборок , а сборки без строгих имен — в каталоге приложения. Если вы хотите развернуть сборки со строгими именами в каталоге приложения, то при обновлении сборки не сможете увеличить номер версии для вспомогательной сборки. Вместо этого необходимо выполнить обновление на месте, при котором вы заменяете существующий код обновленным, сохраняя тот же номер версии. Например, если вы хотите обновить версию 1.0.0.0 вспомогательной сборки с полностью заданным именем «myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a», перезапишите ее обновленным файлом myApp.resources.dll, скомпилированным с использованием того же полностью заданного имени сборки «myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a». Обратите внимание, что использование обновления на месте для файлов вспомогательных сборок затрудняет приложению задачу по корректному определению версии вспомогательной сборки.
Дополнительные сведения об управлении версиями сборок см. в разделах Управление версиями сборок и Обнаружение сборок в среде выполнения.
Извлечение ресурсов из файлов RESOURCES
Если вы решили не развертывать ресурсы в вспомогательных сборках, то все равно можете воспользоваться объектом ResourceManager для прямого доступа к ресурсам из файлов RESOURCES. Для этого требуется развернуть файлы RESOURCES правильным образом. После этого используйте метод ResourceManager.CreateFileBasedResourceManager для создания экземпляра объекта ResourceManager и укажите каталог, содержащий автономные файлы RESOURCES.
Развертывание файлов RESOURCES
При внедрении файлов RESOURCES в сборку приложения и вспомогательные сборки все вспомогательные сборки имеют одинаковое имя файла, однако каждая из них помещается в подкаталог, который отражает ее язык и региональные параметры. И наоборот, при прямом доступе к ресурсам из RESOURCES-файлов все эти файлы можно поместить в один каталог, который обычно находится в каталоге приложения. Имя RESOURCES-файла по умолчанию для приложения состоит только из корневого имени без указания языка и региональных параметров (например, strings.resources). Ресурсы для каждого локализованного языка хранятся в файле, имя которого состоит из корневого имени, за которым следует обозначение языка и региональных параметров (например, strings.ja.resources или strings.de DE.resources).
На следующем рисунке показано, где должны находиться файлы ресурсов в структуре каталогов. На нем также приведены соглашения об именовании для файлов RESOURCE.
Использование диспетчера ресурсов
После создания ресурсов и помещения их в соответствующий каталог создайте объект ResourceManager , чтобы использовать ресурсы путем вызова метода CreateFileBasedResourceManager(String, String, Type) . Первый параметр указывает корневое имя RESOURCES-файла по умолчанию в приложении (в примере из предыдущего раздела этому соответствует «strings»). Второй параметр указывает расположение ресурсов («Resources» в предыдущем примере). Третий параметр указывает используемую реализацию ResourceSet . Если третий параметр равен null , используется среда выполнения по умолчанию ResourceSet .
Не развертывайте приложения ASP.NET с использованием автономных файлов RESOURCES. Это может привести к проблемам с блокировкой и нарушениям развертывания XCOPY. Рекомендуется развертывать ресурсы ASP.NET во вспомогательных сборках. Дополнительные сведения см. в разделе ASP.NET Web Page Resources Overview.
После его создания экземпляра объекта ResourceManager используйте методы GetString, GetObjectи GetStream для извлечения ресурсов, как было описано выше. Однако получение ресурсов непосредственно из RESOURCES-файлов отличается от извлечения внедренных ресурсов из сборок. При получении ресурсов из RESOURCES-файлов методы GetString(String), GetObject(String)и GetStream(String) всегда извлекают ресурсы для языка и региональных параметров по умолчанию, независимо от текущего их значения. Чтобы извлечь ресурсы для текущей или конкретной комбинации языка и региональных параметров приложения, необходимо вызвать метод GetString(String, CultureInfo), GetObject(String, CultureInfo)или GetStream(String, CultureInfo) и указать комбинацию языка и региональных параметров, ресурсы которой требуется получить. Чтобы получить ресурсы для текущего языка и региональных параметров, укажите значение свойства CultureInfo.CurrentCulture в качестве аргумента culture . Если диспетчер ресурсов не может извлечь ресурсы culture , для извлечения необходимых ресурсов он использует стандартные правила резервных ресурсов.
Пример
В следующем примере показано, как диспетчер ресурсов получает ресурсы непосредственно из RESOURCES-файлов. Пример состоит из трех текстовых файлов ресурсов для английского (США), французского (Франция) и русского (Россия) языков и соответствующих региональных параметров. В этом примере по умолчанию задан английский язык (США). Его ресурсы хранятся в файле с именем Strings.txt:
Greeting=Hello Prompt=What is your name?
Ресурсы для французского языка (Франция) хранятся в следующем файле с именем Strings.fr-FR.txt:
Greeting=Bon jour Prompt=Comment vous appelez-vous?
Ресурсы для русского языка (Россия) хранятся в следующем файле с именем Strings.ru-RU.txt:
Greeting=Здравствуйте Prompt=Как вас зовут?
Ниже приведен исходный код для этого примера. В примере создаются экземпляры объектов CultureInfo для английского языка (США), английского языка (Канада), французского языка (Франция) и русского языка (Россия), и каждый из этих языков делается текущим. Метод ResourceManager.GetString(String, CultureInfo) передает значение свойства CultureInfo.CurrentCulture в виде аргумента culture для извлечения подходящих ресурсов для конкретного языка и региональных параметров.
using System; using System.Globalization; using System.Resources; using System.Threading; [assembly: NeutralResourcesLanguage("en-US")] public class Example < public static void Main() < string[] cultureNames = < "en-US", "en-CA", "ru-RU", "fr-FR" >; ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("Strings", "Resources", null); foreach (var cultureName in cultureNames) < Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName); string greeting = rm.GetString("Greeting", CultureInfo.CurrentCulture); Console.WriteLine("\n!", greeting); Console.Write(rm.GetString("Prompt", CultureInfo.CurrentCulture)); string name = Console.ReadLine(); if (! String.IsNullOrEmpty(name)) Console.WriteLine(", !", greeting, name); > Console.WriteLine(); > > // The example displays output like the following: // Hello! // What is your name? Dakota // Hello, Dakota! // // Hello! // What is your name? Koani // Hello, Koani! // // Здравствуйте! // Как вас зовут?Samuel // Здравствуйте, Samuel! // // Bon jour! // Comment vous appelez-vous?Yiska // Bon jour, Yiska!
Imports System.Globalization Imports System.Resources Imports System.Threading Module Example Public Sub Main() Dim cultureNames() As String = Dim rm As ResourceManager = ResourceManager.CreateFileBasedResourceManager("Strings", "Resources", Nothing) For Each cultureName In cultureNames Console.WriteLine() Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName) Dim greeting As String = rm.GetString("Greeting", CultureInfo.CurrentCulture) Console.WriteLine("!", greeting) Console.Write(rm.GetString("Prompt", CultureInfo.CurrentCulture)) Dim name As String = Console.ReadLine() If Not String.IsNullOrEmpty(name) Then Console.WriteLine(", !", greeting, name) End If Next Console.WriteLine() End Sub End Module ' The example displays output like the following: ' Hello! ' What is your name? Dakota ' Hello, Dakota! ' ' Hello! ' What is your name? Koani ' Hello, Koani! ' ' Здравствуйте! ' Как вас зовут?Samuel ' Здравствуйте, Samuel! ' ' Bon jour! ' Comment vous appelez-vous?Yiska ' Bon jour, Yiska!
Версию примера на языке C# можно скомпилировать, запустив следующий пакетный файл. Если используется Visual Basic, замените csc на vbc и расширение .cs на .vb .
md Resources resgen Strings.txt Resources\Strings.resources resgen Strings.fr-FR.txt Resources\Strings.fr-FR.resources resgen Strings.ru-RU.txt Resources\Strings.ru-RU.resources csc Example.cs
См. также раздел
- ResourceManager
- Ресурсы в приложениях .NET
- Упаковка и развертывание ресурсов
- Обнаружение сборок в среде выполнения
Как открыть файл из ресурсов программы? [дубликат]

Как из программы открыть этот файл test.txt ? Например, при обработке нажатия на кнопку.
Отслеживать
задан 14 дек 2018 в 8:44
Андрей Лёвушкин Андрей Лёвушкин
53 7 7 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию

Поменяйте свойство файла
Потом можно так :
var assembly = Assembly.GetExecutingAssembly(); var resourceName = assembly.GetName().Name + ".Resources.test.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) < string result = reader.ReadToEnd(); Console.Write(result); >Console.ReadLine();
Ноб есть еще вариант поменяйте свойства Copy to Output Directory на Copy always (не знаю как будет по-русски)
Потом можно просто
StreamReader streamReader = new StreamReader(«Resources\\test.txt»);
Редактор ресурсов
главная
программы
resource tuner
руководство
Как открыть .DLL или .EXE файл в редакторе ресурсов
При помощи Resource Tuner вы можете открывать исполняемые файлы, такие как .EXE, .DLL, .OCX, скринсейверы (.SCR) и многие другие. Открыв файл, вы получаете доступ к ресурсам файла и можете заменять иконы, курсоры и графику в различных форматах, изменять строчки в меню, диалоговых окнах и других элементах пользовательского интерфейса.
Однако стоит иметь в виду, что ресурсы в исполняемом файле отделены от программного кода, и изменяя интерфейс программы, вы не получаете доступ к коду программы. С помощью редактора ресурсов можно изменить управляющие элементы программы. Код программы с помощью редактора ресурсов изменить нельзя.
Для более серьёзных изменений (которые, впрочем, ни к чему хорошему не приведут без достаточного опыта в программировании приложений для Windows) рекомендуем использовать PE Explorer (редактор структуры PE файлов) или FlexHex (хекс-редактор для бинарных файлов).
Открытие EXE или DLL файла в Resource Tuner
Resource Tuner поддерживает несколько способов открытия файлов. Чтобы открыть файл для просмотра и редактирования, нажмите кнопку Open File на панели инструментов или выберите команду File > Open [CTRL+O] из меню. Выпадающее меню рядом с кнопкой на тулбаре даёт вам быстрый доступ к списку последних открывавшихся файлов. Этот же список можно получить командой File > Recent Files из меню программы. Количество файлов в списке настраивается в диалоге Customize.

Вы также можете открыть файл при помощи Resource Tuner прямо из Проводника Windows, щёлкнув по файлу правой кнопкой и выбрав Open with Resource Tuner из контекстного меню.
Или вы можете просто перетащить и бросить иконку файла из Проводника Windows на иконку Resource Tuner на рабочем столе или на окно запущенного Resource Tuner.
Вы так же можете открыть файл из командной строки.
Например: restuner.exe filename.exe
Мы рекомендуем проводить все операции по редактированию ресурсов только с копиями файлов, и ни в коем случае не с оригиналами, и только когда вы поместили копию файла в отдельную директорию.
При открытии файла Resource Tuner производит несколько автоматических операций: распаковывает файл, если обнаруживается, что он был запакован при помощи UPX, затем идёт проверка структуры и ресурсов файла на возможные ошибки, и наконец перестройка повреждённых ресурсов в соответствии со спецификацией формата исполняемых файлов.
Ошибки при открытии файла
Если при открытии файла возникает ошибка, то скорее всего по трём причинам: файл защищён, файл 16-битный, или это вообще не исполняемый файл.
1. Ошибка: Файл повреждён, сжат упаковщиком или защищён протектором.
Вероятность того, что файл сжат для уменьшения размера, весьма велика. Упаковщиков и протекторов для исполняемых файлов существует не один десяток, и всё время появляются новые. Resource Tuner поддерживает распаковку только одного, зато самого распостранённого упаковщика — UPX. Остальные упаковщики не поддерживаются, и вам придётся самостоятельно заниматься распаковкой файла, прежде чем вы сможете открыть файл для просмотра или редактирования.
Данная ситуация не рассматривается, как ошибка программы. Мы не собираемся ни бороться с попытками других авторов программ защитить свои творения от взлома, ни поддерживать распаковку нескольких десятков разных упаковщиков, среди которых есть и коммерчиские продукты, и самоделки.
2. Ошибка: Файл определён, как 16-битный NE Executable. Этот формат не поддерживается!
Наши программы работают только с 32- и 64-битными PE файлами. Формат NE (сокращение от «New Executable») — это формат 16-битных приложений, оставшийся в наследство от старых версий Windows 3.xx. С появлением Windows 95 этот формат считается устаревшим и не используется, хотя и может исполнятся на современных платформах от Microsoft. Мы не поддерживаем 16-битные файлы и не собираемся их поддерживать.
3. Ошибка: Файл не является EXE или DLL файлом. Вообще!
Resource Tuner определяет файл не по расширению. Если вы переименуете расширение у исполняемого файла, скажем, исправите .EXE на .TXT или вообще удалите расширение, Resource Tuner этим не обманешь: программа при открытии файла анализирует заголовок файла внутри файла, а на расширение вообще не смотрит.
Поэтому, если Resource Tuner вам сообщает, что файл не является исполняемым, то это так оно и есть. Если кто-то зачем-то снабдил текстовый файл в поставке игры расширением .DLL, то от этого файл не перестаёт быть текстовым, и не становится динамической библиотекой. Не дайте расширению файла себя обмануть.
Какие файлы не имеет смысла открывать в редакторе ресурсов
Не смотря на то, что Resource Tuner предназначен для открытия и редактирования любых 32-/64-битных исполняемых файлов, существуют некоторые виды EXE файлов, в которых ресурсы практически отсутствуют.
1. Файлы, созданные при помощи Visual Basic.
В таких файлах в секции ресурсов ничего нет, кроме иконы и информации о версии. Строчки и диалоги в программах, написанных на визуальном бейсике, хранятся в своём собственном закрытом формате, и стандартная секция ресурсов в них не используется.
2. Файлы .EXE размером в гигабайт и более.
Поскольку Resource Tuner — это 32-битная программа, существуют естественные ограничения для размещения образа открываемого файла в виртуальной памяти в пределах первого гигабайта. Файл размером в гигабайт и более туда просто не поместится.
3. Самораспаковывающиеся архивы в виде EXE файлов.
В таких файлах в ресурсах ничего нет, кроме иконы и информации о версии, а может и этого не быть. По сути, это архивированные данные, снабжённые подпрограммой для распаковки.
4. Инсталляторы других программ.
В таких файлах в ресурсах ничего нет, кроме иконы и информации о версии. Очень похожи на п.3. Файл инсталлятора можно рассматривать как контейнер, внутри которого содержится другой .EXE файл в сжатом виде и подпрограмма для его извлечения. К тому же, программы для создания инсталляторов используют разные алгоритмы для хранения внутри себя архивированных данных.

Руководство
начало | след.
Скачайте бесплатную ознакомительную версию!
Resource Tuner работает на всех версиях Windows
от 2000 и XP до 8, 10 и 11.
Минимальные системные требования:
Процессор Intel Pentium® или AMD K5 166 MHz
16 MB RAM
Copyright © 2024 Heaventools Software. Все права сохранены.
Файлы ресурсов (C++)
. Так как в проектах на языках программирования .NET не используются файлы описания ресурсов, ресурсы необходимо открывать из обозревателя решений. Используйте редактор изображений и двоичный редактор для работы с файлами ресурсов в управляемых проектах.
Все управляемые ресурсы, которые нужно редактировать, должны быть связанными ресурсами. Редакторы ресурсов Visual Studio не поддерживают редактирование внедренных ресурсов.
Файл ресурса термина может ссылаться на любой из нескольких типов файлов, например:
- Файл скрипта ресурса ( .rc ) программы.
- Файл шаблона ресурса ( .rct ).
- Отдельный ресурс, существующий как автономный файл. Этот тип включает растровое изображение, значок или файл курсора, на который ссылается .rc файл.
- Файл заголовка, созданный средой разработки. Этот тип включает в себя Resource.h , который ссылается на .rc файл.
Другие типы файлов, такие как .exe , .dll и .res файлы, также могут содержать ресурсы, к ним можно получить доступ, хотя первые два файла обычно не считаются файлами ресурсов.
Вы можете работать с файлами ресурсов и ресурсами из проекта. Вы также можете работать с ресурсами и файлами ресурсов, которые не являются частью текущего проекта или которые были созданы вне среды разработки Visual Studio. Например, доступны следующие возможности:
- Работать с вложенными и условно включенными файлами ресурсов.
- Обновите существующие ресурсы или преобразуйте их в Visual C++.
- Импортировать графические ресурсы в текущий файл ресурсов или экспортировать их из него.
- Включать общие или доступные только для чтения идентификаторы (символы), которые нельзя изменить с помощью среды разработки.
- Включите ресурсы в исполняемый .exe (или .dll ) файл, который не требует редактирования (или не должен быть изменен), например общих ресурсов между несколькими проектами.
- Включать типы ресурсов, не поддерживаемые средой разработки.
Редактируемые ресурсы
Для изменения ресурсов, содержащихся в них, можно открыть следующие типы файлов:
| Имя файла | Description |
|---|---|
| .rc | Файлы скриптов ресурсов |
| .rct | Файлы шаблонов ресурсов |
| .res | Файлы ресурсов |
| .resx | Управляемые файлы ресурсов |
| .exe | Исполняемые файлы |
| .dll | Файлы библиотеки динамической компоновки |
| .bmp , .ico , .dib , .cur | Растровое изображение, значок, панель инструментов и файлы курсоров |
Среда Visual Studio работает со следующими файлами при редактировании ресурсов:
| Имя файла | Description |
|---|---|
| Resource.h | Файл заголовка, созданный средой разработки, содержащей определения символов. |
Редакторы ресурсов не считывают или не считывают .rc файлы resource.h напрямую. Компилятор ресурсов компилирует их в .aps файлы, используемые редакторами ресурсов. Этот файл представляет собой этап компиляции и содержит только символьные данные.
Как и в обычном процессе компиляции, данные, которые не символично, например примечания, не карта во время процесса компиляции.
Всякий раз, когда .aps файл не синхронизирован с файлом .rc , создается .rc файл. Например, при сохранении редактор ресурсов перезаписывает .rc файл и resource.h файл. Все изменения в самих ресурсах остаются включенными в .rc файл, но примечания всегда теряются после .rc перезаписи файла. Сведения о сохранении комментариев см. в разделе «Включение ресурсов во время компиляции».
Ресурсы манифеста
В классических проектах C++ ресурсы манифеста — это XML-файлы, описывающие зависимости, используемые приложением. Например, в Visual Studio этот файл манифеста, созданный мастером MFC, определяет, какую версию библиотек DLL общего элемента управления Windows следует использовать в приложении:
Your app description here
Для приложения Windows XP или Windows Vista ресурс манифеста должен указать самую текущую версию распространенных элементов управления Windows для используемого приложения. В приведенном выше примере используется версия 6.0.0.0 , которая поддерживает элемент управления. Syslink
Допускается иметь только один ресурс манифеста на каждый модуль.
Чтобы просмотреть сведения о версии и типе, содержащиеся в ресурсе манифеста, откройте файл в средстве просмотра XML или текстовом редакторе Visual Studio. Если вы откроете ресурс манифеста из представления ресурсов, этот ресурс откроется в двоичном формате.
Открытие ресурса манифеста
- Откройте проект в Visual Studio и перейдите к Обозреватель решений.
- Разверните папку «Файлы ресурсов», а затем:
- Чтобы открыть в текстовом редакторе, дважды щелкните .manifest файл.
- Чтобы открыть в другом редакторе, щелкните файл правой .manifest кнопкой мыши и выберите «Открыть с помощью». Укажите редактор для использования и нажмите кнопку «Открыть«.