Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как вшить текстовый файл в экзешник? в C# (VS 2008)

47K
27 декабря 2009 года
rustamh
32 / / 19.12.2009
у меня есть проект. он сейчас использует текстовый файл, который находится в одной папке с экзешником. не хочу чтобы пользователи могли так просто его брать и делать с ним что хотят. лучше бы если он был внутри экзешника. либо как-то защищен.

Я прочитал статью Выдёргивание и сохранение ресурсов в DLL или EXE. - она как бы четко по теме. но написана не на C#. и показалась мне замудренной. может от недостатка моих знаний.
и я подумал - может в VS 2008 есть способы сделать это проще, без создания своих процедур и т.п.

если кто знает - подскажите пожалуйста.
51K
27 декабря 2009 года
Indian
37 / / 23.12.2009
Если просто строки, то:

Шаг 45 - Создаем файл с ресурсами строк
Шаг 47 - Присоединяем файл ресурсов к exe

А если по-серьезней, то:

http://support.microsoft.com/kb/84062
Мысль такая:
Хедер exe'шника состоит из конкретного числа int'ов, по которым можно вычислить конец файла. И далее прочесть то, что после него.
Под MS-DOS файл приклеивали так:
Цитата:
tail base.txt>>prog1.exe



Только вот применимо ли это к c#.

47K
27 декабря 2009 года
rustamh
32 / / 19.12.2009
мне как раз вариант со строками подошел бы наверное
только когда делаю все по инструкции - выдается следующая ошибка

Resgen.exe resourse.txt не является внутренней или внешней командой, исполняемой программой или пакетным файлом

то, что выдается строка Resgen.exe resourse.txt наверное говорит о том, что bat-ник срабатывает. но проблема именно с Resgen.exe
34K
27 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
У меня похожий вопрос а можно ли как то изменять сам экзешник во время выполнения программы тоесть что бы она сама в себя что нибудь дописывала ? Или как сделать нопример так... В процессе работы программы создается файл который не желательно видеть и вообще изменять кроме как из самой программы...
51K
28 декабря 2009 года
Indian
37 / / 23.12.2009
Цитата:
у меня есть проект. он сейчас использует текстовый файл, который находится в одной папке с экзешником. не хочу чтобы пользователи могли так просто его брать и делать с ним что хотят. лучше бы если он был внутри экзешника. либо как-то защищен.


Как вариант: присвоить переменной содержимое файла.

Цитата:
Resgen.exe resourse.txt не является внутренней или внешней командой, исполняемой программой или пакетным файлом


Значит resgen.exe то ли нет, то ли не видно.
Если 3.5, он может быть где-то здесь: C:\Program Files\Microsoft SDKs\Windows\bin
Если 2.0, то C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
В крайнем случае он есть .NET Framework SDK 3.5. Кстати он весит 4 гига. А resgen всего ~49кб.
Второе название: ResXtoResources.exe

Цитата:
то, что выдается строка Resgen.exe resourse.txt наверное говорит о том, что bat-ник срабатывает. но проблема именно с Resgen.exe


Можно просто набирать в консоли:

 
Код:
resgen resourse.txt
1.9K
28 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: rustamh
мне как раз вариант со строками подошел бы наверное


Ну тогда может быть стоит зайти в свойства проекта, там есть вкладка ресурсов - добавляете какие нужны.

51K
28 декабря 2009 года
Indian
37 / / 23.12.2009
Можно создать такой файл даже программно(ResourceWriter):
Код:
using System;
using System.Resources;

namespace ResDemo
{
    class MainClass
    {
        public static void Main(string[] args)
        {
        ResourceWriter rw = new ResourceWriter("demo.resx");//будет в папке с программой
            rw.AddResource( "Title", "Professional C#" );
            rw.AddResource( "Chapter", "Localization" );
            rw.AddResource( "Author", "Christian Nagel" );
            rw.AddResource( "Publisher", "Wrox Press" );
            rw.Close();
        Console.WriteLine("Hello World!");
        }
    }
}

Взято и переделано отсюда:

Локализация. Создание, генерация и использование ресурсных файлов:
http://www.rsdn.ru/article/dotnet/csprof2005_localization.xml#EWKAC
1.9K
28 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Indian
Можно создать такой файл даже программно(ResXResourceWriter).
Создание, генерация и использование ресурсных файлов:
http://www.rsdn.ru/article/dotnet/csprof2005_localization.xml#EWKAC



Для решения задачи локализации, либо когда над проектом работает группа из программистов и дизайнеров/переводчиков этот подход является наиболее правильным (использование ресурсных файлов)!
Однако топик-стартеру проще и удобнее заюзать средства, которые есть в Visual Studio, чем генерить ресурсные файлы вручную.

P.S. про ResourceWriter не знал, интересно в каких случаях ресурсы надо генерировать в программе? =)
За системный подход ловите плюс =)

Цитата: shadowmaster63
У меня похожий вопрос а можно ли как то изменять сам экзешник во время выполнения программы тоесть что бы она сама в себя что нибудь дописывала ? Или как сделать нопример так... В процессе работы программы создается файл который не желательно видеть и вообще изменять кроме как из самой программы...


Вариант с использованием специальных папок для хранения настроек приложения не подойдет?
http://habrahabr.ru/blogs/development/70922/

34K
28 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Цитата: GreenRiver

Вариант с использованием специальных папок для хранения настроек приложения не подойдет?
http://habrahabr.ru/blogs/development/70922/


я думал над этим... наверно перепишу часть кода что бы в потоке работала без файлов... а программа не может в ходе своего выполнения добавлять в себя ресурсы или менчть их ?

47K
28 декабря 2009 года
rustamh
32 / / 19.12.2009
У меня раньше было так:

 
Код:
string[] FileText = File.ReadAllLines(path_to_text_file, Encoding.Default);


не знаю, то ли я туплю то ли что. но не получается у меня применить приведенные подсказки :(

я в ресурсах сделал - Добавить новый текстовый файл. у меня появился текстовый файл чистый. я в него копипастнул свой файл. в результате смотрю - экзешник прибавил в весе на величину файлика. а самого файла нигде и не видно. как раз то что нужно. (только у меня не получается обратиться к его данным).

но неужели нельзя без всяких заморочек , строкой вроде изначальной
 
Код:
string[] FileText = File.ReadAllLines(path_to_text_file, Encoding.Default);

взять и считать весь этот файл из ресурса?
34K
28 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Stream myResurce = new MemoryStream(global::Mynamespace.Properties.Resources.MyResource);
я вот так юзаю а там в потоке уже че надо то и делаю...
Вот только можно ли потом обратно в этот ресурс чего нибудь записать ?
47K
28 декабря 2009 года
rustamh
32 / / 19.12.2009
у меня это не проходит

 
Код:
Stream myResurce = new MemoryStream(global::Mynamespace.Properties.Resources.MyResource)


когда дохожу до
Mynamespace.Properties.Resources. - жду что в выпадающем меню выпадет мой TextFile.txt, но он не выпадает. Среди ресурсов для выбора появляются только пара иконок для кнопок и еще что-то.
сразу говорю, что я уже подключил эти библиотеки

using System.Resources;
using System.Reflection;
using System.Threading;
47K
28 декабря 2009 года
rustamh
32 / / 19.12.2009
нашел resgen, сгенерировал файл resource.resources . но теперь не могу связать его с исполняемым файлом. в примере показано так

Соединения файла EXE и ресурсов производиться при компиляции. Это делается путем использованию ключа /res при компиляции. Вот пример BAT файла:

 
Код:
csc /res:resource.resources 4.cs



но не понятно, где размещать этот файл. я разместил в корневой файле сам файл ресурсов и батник а в батнике прописал:
csc /res:resource.resources Program.cs

у меня вообще несколько файлов cs в папке. я пробовал прописывать по разные. пробовал запускать батник из папки с проектом. из папки Debug еще может откуда-то.

но отладчик выдает ошибку

 
Код:
Не удалось найти ресурсы, соответствующие указанной культуре или нейтральной культуре. Проверьте правильность внедрения или связывания "resource.resources" со сборкой "ИмяПроекта" во время компиляции, или убедитесь, что все необходимые сопутствующие сборки полностью подписаны и могут быть загружены.
34K
28 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
new MemoryStream(global:: введи это а дальше выпадит меню
Ты зачем мою то ставишь? у тебя своя должна быть! название другое !
47K
29 декабря 2009 года
rustamh
32 / / 19.12.2009
shadowmaster63 ты меня за кого считаешь? :) за имбицила последнего?
конечно же у меня названия другие. просто твой пример вставил для наглядности.
51K
29 декабря 2009 года
Indian
37 / / 23.12.2009
Цитата: rustamh
но отладчик выдает ошибку


То же самое, только на английском:

Цитата:
Unhandled Exception: System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "demo.resources" was correctly embedded or linked into assembly "ResDemo" at compile time, or that all the satellite assemblies required are loadable and fully signed.




Решение:

 
Код:
csc /res:resource.resources 4.cs

заменить на
 
Код:
csc /res:resource.en-US.resources 4.cs

В названии файла и исходниках тоже поменять.

Под MonoDevelop 2.0 скомпилилось, однако, там уже своя ошибка:
Цитата:
System.NotSupportedException: This .resources file requires unsupported set class version: 2


Это говорит о том, что нужно использовать для компиляции профиль 2.*
Т.е. использовать не mcs, а gmcs.
p.s. man mcs

51K
29 декабря 2009 года
Indian
37 / / 23.12.2009
Рабочий код:
Код:
using System;
using System.Resources;
using System.Reflection;

namespace ResDemo
{
    class MainClass
    {
        public static void Main(string[] args)
        {
ResourceManager rm;
Assembly assembly = Assembly.GetExecutingAssembly();
rm = new ResourceManager( "demo.en-US", assembly );
Console.WriteLine(rm.GetString("Author"));
            }
    }
}

 
Код:
gmcs /res:demo.en-US.resources Main.cs
47K
29 декабря 2009 года
rustamh
32 / / 19.12.2009
уважаемые, ответьте пожалуйста на пост #10 .

если не ответите, или ответ будет отрицательным, тогда буду уже дальше с ресурсами разбираться.

просто сегодня еще одна задача появилась , которая мне покоя не дает. с утра не могу разобраться с ней.
51K
29 декабря 2009 года
Indian
37 / / 23.12.2009
Ответ положительный, только без ресурсов не обойтись.

Есть более простой вариант - см. третью страницу темы.

Программа №1. Генерация файла ресурсов.:
Код:
using System;
using System.Resources;
using System.IO;

namespace ResDemo
{
    class MainClass
    {
        public static void Main(string[] args)
        {
        string[] file_content=new string[300];
            file_content=File.ReadAllLines("base.txt");
           
        ResourceWriter rw = new ResourceWriter("demo.en-US.resources");//будет в папке с программой
            rw.AddResource("Title",file_content);//см.далее.
            rw.Close();
           
        }
    }
}


base.txt выглядит так, и находится в папке с программой:
 
Код:
C# (произносится си-шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET. Компилятор с C# входит в стандартную установку самой .NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств, вроде Visual Studio.


Компилируем и запускаем программу №1.


Программа №2. Чтение из файла ресурсов.:
Код:
using System;
using System.Resources;
using System.Reflection;

namespace ResDemo
{
    class MainClass
    {
        public static void Main(string[] args)
        {
string[] file_content=new string[300];

ResourceManager rm;
Assembly assembly = Assembly.GetExecutingAssembly();
rm = new ResourceManager( "demo.en-US", assembly );
file_content=(string[])rm.GetObject("Title");
Console.WriteLine(file_content[0]);
            }
    }
}

Переносим demo.en-US.resources в папку с программой №2.

Компилируем:
 
Код:
csc /res:demo.en-US.resources Main.cs
или
gmcs /res:demo.en-US.resources Main.cs

При запуске Main.exe, выводится строка из base.txt.

Имена ресурсов должны совпадать:
 
Код:
rm = new ResourceManager( "demo.en-US", assembly ); //Подразумевается demo.en-US.resources
csc /res:demo.en-US.resources Main.cs
ResourceWriter rw = new ResourceWriter("demo.en-US.resources");

Иначе снова появится ошибка культуры.
5
29 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: rustamh
у меня есть проект. он сейчас использует текстовый файл, который находится в одной папке с экзешником. не хочу чтобы пользователи могли так просто его брать и делать с ним что хотят. лучше бы если он был внутри экзешника. либо как-то защищен.

Я прочитал статью Выдёргивание и сохранение ресурсов в DLL или EXE. - она как бы четко по теме. но написана не на C#. и показалась мне замудренной. может от недостатка моих знаний.
и я подумал - может в VS 2008 есть способы сделать это проще, без создания своих процедур и т.п.

если кто знает - подскажите пожалуйста.



Вот вы развели тут балаган....

1) Находим каталог Properties в дереве проекта
2) Тыкаем дважды на Resources.resx
3) Выбераем в меню Add Resource опцию Add Existing File...
4) Находим txt файл, например sample.txt (хорошо его бы разместить вместе с решением и добавить в соответствующий проект)
5) VS автоматически создаст код для загрузки этого ресурса.

В коде можно обращаться к ресурсу через статическое свойство (sample) член класса MyProject.Properties.Resources.


З.Ы. В #D3.0 аналогично.

51K
29 декабря 2009 года
Indian
37 / / 23.12.2009
Еще один вариант:
Код:
using System;
using System.Resources;
using System.Text;
using System.Reflection;

namespace BaseReader
{
    class MainClass
    {
        public static void Main(string[] args)
        {
        Assembly a = Assembly.GetExecutingAssembly();
        byte[] txtStream = new byte[32];

        a.GetManifestResourceStream("base.txt").Read(txtStream,0,32);//читаем 32 байта из base.txt.
        string s = System.Text.Encoding.UTF8.GetString(txtStream);//преобразуем в строку.
        Console.WriteLine(s);
        }
    }
}

Перед компиляцией base.txt пометить как "embed as source".

Цитата: hardcase

В коде можно обращаться к ресурсу через статическое свойство (sample) член класса MyProject.Properties.Resources.


В MonoDevelop 2.0 так не получается.
А также, видимо, в VS 2008, у топик-стартера.

47K
29 декабря 2009 года
rustamh
32 / / 19.12.2009
hardcase
 
Код:
Вот вы развели тут балаган....

1) Находим каталог Properties в дереве проекта
2) Тыкаем дважды на Resources.resx
3) Выбераем в меню Add Resource опцию Add Existing File...
4) Находим txt файл, например sample.txt (хорошо его бы разместить вместе с решением и добавить в соответствующий проект)
5) VS автоматически создаст код для загрузки этого ресурса.

В коде можно обращаться к ресурсу через статическое свойство (sample) член класса MyProject.Properties.Resources.


вот как раз про это я писал в посте №12, - не получается так обратиться к ресурсу почему-то

 
Код:
когда дохожу до
Mynamespace.Properties.Resources. - жду что в выпадающем меню выпадет мой TextFile.txt, но он не выпадает. Среди ресурсов для выбора появляются только пара иконок для кнопок и еще что-то.
сразу говорю, что я уже подключил эти библиотеки

using System.Resources;
using System.Reflection;
using System.Threading;
5
30 декабря 2009 года
hardcase
4.5K / / 09.08.2005
rustamh
Описанный мною способ прекрасно работает в VS2008. Чем пользуетесь?
47K
30 декабря 2009 года
rustamh
32 / / 19.12.2009
hardcase
да, у меня тоже теперь работает благодаря вам. у меня тоже ВС2008.
просто в дереве проекта я не в тот файл .resx добавлял его. (в Form1.resx). А когда снова внимательно посмотрел вашу запись нашел именно то, что вы написали Resources.resx , добавил туда. теперь через точку добавляется.

Теперь ИмяПроекта.Properties.Resources.TextFile1 - содержит текст файла.
самое обидное, что я сам пытался это проделать прежде чем обращаться на форум. но почему-то добавлял ресурс не туда. и потом мы устроили этот "балаган".

один мой знакомый говорит, что не хорошо файл (а он у меня 6мб), помещать в ресурсы. прав ли он?
и еще - насколько легко будет посторонним людям вытащить файл из экзешника
5
30 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: rustamh

один мой знакомый говорит, что не хорошо файл (а он у меня 6мб), помещать в ресурсы. прав ли он?

Зависит от задачи, например некоторые мини-игры (Eufloria) кучу текстур и звуков в ресурсах держат.

Цитата: rustamh
и еще - насколько легко будет посторонним людям вытащить файл из экзешника

Элементарно :)

262
31 декабря 2009 года
Iktomy
1.2K / / 11.10.2004
Ну вы ребята извращенцы. Зачем пихать ресурсы в исполняемый файл - это не готичьно.

Автор, советую файлик держать в zip с нулевым сжатием (если критична скорость доступа к ресурсу). Самое оно, что бы подальше от глаз любопытных, запаролить архив.

А еще готичьнее - зашифровать текстовик и уже с ним таким макаром работать. Но первый способ проще, как по мне
47K
03 января 2010 года
rustamh
32 / / 19.12.2009
все таки запихал все в ресурсы. вроде работает нормально. зато теперь вместо папки только один файл. мне кажется это удобнее намного.

теперь только возникла другая проблема.
у меня в проге используется библиотека Microsoft.mshtml.dll. и как я заметил, из-за этого у людей, у кого net frameworks 3.5 не установлен вылазила ошибка. Поэтому я скопировал файлик Microsoft.mshtml.dll в папку проекта и в References указал ссылку на этот файлик. С тех пор приложение стало работать на всех компах.

а теперь, когда я сделал всю прогу в один exe файл - опять та же ситуация - подскажите пожалуйста, как мне впихнуть файл Microsoft.mshtml.dll опять в проект, но уже в качестве ресурса, и потом подключить его.

я сейчас добавил его в Resourses.resx и пытался подключить так:
 
Код:
using ProjectName.Properties.Resourses.Microsoft.mshtml.dll;

но что-то не получается
7
03 января 2010 года
@pixo $oft
3.4K / / 20.09.2006
Конечно,не получится,ибо файл подключается раньше,чем ты его извлечёшь из ресурсов(т.е. это всё равно,что пытаться Kernel32.dll извлечь,если б его в системе не было–абстрактный случай)
47K
03 января 2010 года
rustamh
32 / / 19.12.2009
насколько я понимаю, мне нужно программно проделать все тоже , что раньше делал руками.

Задать References на файлик из resurses.resx .
а затем подключить его используя using <library_name>

только как это сделать? и надо ли делать именно это
5
03 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: rustamh
насколько я понимаю, мне нужно программно проделать все тоже , что раньше делал руками.

Задать References на файлик из resurses.resx .
а затем подключить его используя using <library_name>

только как это сделать? и надо ли делать именно это

Глупости.

.NET позволяет "слить" код двух "чистых" сборок (т.е. содержащих исключительно управляемый код), но для этого нужны дополнительные телодвижения после компиляции:
1) Декомпилируем ildasm-ом полученный exe-шник и dll-файл.
2) Полученные исходники компилируем снова в один exe файл ilasm-ом (не забывая о ссылках).

Правда зачем это все, когда можно в системных требованиях написать: .NET 3.5sp1 (или распространять два файла), и это, скажу я вам, - нормально.

47K
03 января 2010 года
rustamh
32 / / 19.12.2009
просто у многих людей не стоит фреймворкс 3.5.
а у меня из-за отсутствия библиотеки не работает всего навсего 3 строки
 
Код:
IHTMLDocument2 htmlDocument = browser.Document.DomDocument as IHTMLDocument2;

IHTMLSelectionObject currentSelection = htmlDocument.selection;
IHTMLTxtRange range = currentSelection.createRange() as IHTMLTxtRange;


просто мне кажется намного приятнее, когда скачал один файлик exe и все работает.
без разных обновлений и т.п.

ведь к тому же программа работала, когда просто в папке с exe лежала библиотека - на всех компах прога работала. вот точно также бы ее внутрь exe теперь записать

а то, что вы написали пока не понятно :(
5
03 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: rustamh
просто мне кажется намного приятнее, когда скачал один файлик exe и все работает.

Пользователю на самом деле глубоко плевать сколько у программы файлов, лишь бы она свою задачу выполняла. Более того, никто просто exe не раздает - это или архив, или инсталлятор (что вообще-то тоже архив), а для архива без разницы сколько файлов - один или тысяча.

262
03 января 2010 года
Iktomy
1.2K / / 11.10.2004
Поофтоплю...
Следующим вопросом автора будет: Как вшить Windows в exe'шник:)

Автор, а вы не думали, что из-за ошибки чтения/записи при работе с "вшитыми" данными может произойти такая прекрасная вещь, как последующая неработоспособность вашего раздутого exe?
47K
03 января 2010 года
rustamh
32 / / 19.12.2009
Iktomy
подловил :)
спасибо огромное всем , кто помогал.
я проработал 2 года 1с-ником. отстал от жизни маленько. вот начал осваивать си шарп.
опыт 1с конечно пригодился - ООП оно везде ооп. но и много нюансов конечно.
например - в 1с компилить ниче не надо. Классы создавать не надо. там уже приложение готовое. надо плагины только делать и т.п.

а тут все с нуля когда делаешь (с нуля относительно конечно, ведь VS 2008 очень не плохо помогает) - появляются разные вопросы.
262
04 января 2010 года
Iktomy
1.2K / / 11.10.2004
Все лирика, конечно. Но я бы все-таки рекомендовал присмотреться к концепции содержания "яиц" в разных корзинах.
55K
05 января 2010 года
RabiatoR
6 / / 04.01.2010
Просто создай *.res файл из своего текстового файла, и присоедини его к проекту своему, далее читай ресурсы приложения, извлекай данные ресурса в unsigned char buffer[]; и делай сними что надо, если ничего ненадо) то просто сохраняй данные в файл текстовый в папке temp
5
05 января 2010 года
hardcase
4.5K / / 09.08.2005
RabiatoR
Ваша адекватность поражает, я имею в виду, пожалуй, все ваши сообщения.
47K
20 января 2011 года
ryabinin313
13 / / 07.11.2009
Здравствуйте!
Прочитал тему...

раньше было так:
 
Код:
richTextBox1.LoadFile("..\\text\\title.rtf");


Сделал текстовый файл ресурсом.
Теперь пытаюсь сделать так:
 
Код:
richTextBox1.LoadFile(Inc1.Properties.Resources.title);


После запуска программы в richTextBox1 ничего не отображается. Что я не так делаю? Как это можно реализовать? Раньше с ресурсами никогда не работал...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог