Как хранить файлы в EXE

Итак, я работаю над программированием своего собственного установщика на C #, и я хотел бы сделать что-то вроде размещения файлов в .exe, чтобы я мог сделать File.Copy(file, filedir);

Или, если это невозможно, есть ли другой способ сделать то, что я пытаюсь сделать?


person S3THST4    schedule 08.02.2009    source источник
comment
из любопытства, почему вы программируете свой собственный установщик?   -  person Serge Wautier    schedule 09.02.2009
comment
Люди всегда говорят вам кодировать код кодом, если вы хотите выучить язык, пока вы на самом деле что-то не кодируете, тогда они все НЕ ПРИДУМЫВАЮТ ЗАНОВО ЭТО КОЛЕСО   -  person Rayne    schedule 09.02.2009
comment
Нет ничего плохого в том, чтобы научиться кодировать, но при написании производственного кода не следует изобретать велосипед.   -  person Erik Funkenbusch    schedule 09.02.2009
comment
Когда вы программируете установщик, вы не изобретаете колесо, потому что колесо еще не изобретено. Все установщики - просто квадратики, идеального установщика еще никто не изобрел.   -  person Bitterblue    schedule 29.01.2013
comment
@Rayne, благослови тебя за этот комментарий! Мой следующий фаворит - когда они уходят Зачем тебе вообще это делать?   -  person mathgenius    schedule 20.09.2017


Ответы (4)


Я бы не стал кодировать свой собственный установщик, но если вы действительно хотите встроить файлы в свою сборку, вы можете использовать строго типизированные ресурсы. В диалоговом окне свойств вашего проекта откройте вкладку «Ресурсы» и добавьте свой файл. Затем вы сможете получить файл, используя:

ProjectNamespace.Properties.Resources.MyFile

Затем вы сможете записать встроенный ресурс на диск, используя:

System.IO.File.WriteAllBytes(@"C:\MyFile.bin", ProjectNamespace.Properties.Resources.MyFile);
person Shawn Miller    schedule 08.02.2009
comment
Спасибо за ваш ответ, это то, что я ищу. Итак, я использую File.Copy(); и мне нужна перегрузка строки для пути к файлу. Любые предложения PS-Пробовал .ToString(); - person S3THST4; 09.02.2009
comment
Что не так с проектом С#, на который я ссылался выше, с исходным кодом? Разве это не то, что вы ищете? - person Erik Funkenbusch; 09.02.2009
comment
Обновлено, чтобы показать, как вы можете затем записать файл на диск, используя System.IO.File.WriteAllBytes. - person Shawn Miller; 09.02.2009
comment
Спасибо за это, я, вероятно, буду использовать это для инструмента конфигурации, который позволяет пользователю выбирать между различными переопределениями DLL. Таким образом, я уверен, что мне не нужно манипулировать внешними файлами в папке приложения, с которыми пользователи могут возиться или удалять. - person Nyerguds; 28.12.2010

Честно говоря, я бы посоветовал вам НЕ создавать свой собственный установщик. Есть много проблем с созданием инсталляторов. Даже крупные производители установщиков больше не делают свои собственные настоящие установщики, они просто создают пользовательские пакеты MSI.

Используйте установщик Мирософт (MSI). Это правильно. Создайте для него свой собственный интерфейс, но не воссоздавайте уже существующее очень сложное колесо.

ОБНОВЛЕНИЕ: Если вы делаете это просто для обучения, я бы не стал думать об этом как об «установщике». У вас может возникнуть соблазн взять свое «исследование» и использовать его когда-нибудь, и, честно говоря, именно поэтому мы получаем так много проблем, когда выходят новые версии Windows. Люди создают свои собственные колеса с предположениями, которые недействительны.

То, что вы на самом деле пытаетесь сделать, называется «упаковкой», и вам действительно нужно хорошо познакомиться с форматом Executable PE, потому что вы говорите об изменении структуры PE-образа на диске.

Вы можете смоделировать это, поместив файлы в ресурсы, но на самом деле это не то, что делают установщики или самораспаковывающиеся программы.

Вот ссылка на руководство по Self-Extractor, но оно не на C#.

Я недостаточно знаю требования .NET PE, чтобы понять, можно ли это сделать с исполняемым файлом управляемого кода или нет.

ОБНОВЛЕНИЕ 2: Это, вероятно, больше того, что вы ищете, оно встраивает файлы в ресурс, но, как я уже сказал, это не совсем так, как это делают профессиональные установщики или самораспаковщики. Я думаю, что существуют различные ограничения на то, что вы можете вставлять в качестве ресурсов. А вот и демонстрация самоизвлекающегося, написанная на C#.

person Erik Funkenbusch    schedule 08.02.2009
comment
Я бы определенно изучил все доступные установщики, прежде чем писать свой собственный. Это как раз то, о чем я говорил в статье «Не изобретайте колесо, если вы не планируете узнать больше о колесах codinghorror.com/blog/archives/001145.html - person Jeff Atwood; 09.02.2009
comment
Единственная причина, по которой я был, состояла в том, чтобы посмотреть, смогу ли я. Я не пытаюсь сделать это рекламой или чем-то еще, просто пытаюсь создать 1 форму, которая, когда вы нажимаете «Установить», просто помещает файлы в каталог. - person S3THST4; 09.02.2009
comment
S3thst4, определенно изучите доступные установщики, но не позволяйте скептикам оттолкнуть вас, большинство доступных установщиков оставляют желать лучшего, особенно MSI, определенно есть место для значительного улучшения, установщики не прогулка в парке, хотя , будьте готовы к жестким трансплантатам. - person Tim Jarvis; 09.02.2009

Я предполагаю, что здесь, но если вы пытаетесь сохранить ресурсы в своем приложении перед компиляцией, вы можете в Project Explorer щелкнуть правой кнопкой мыши файл, который вы хотите добавить, выбрать свойства и изменить тип на Embedded Resource.

Позже вы сможете получить доступ к встроенным ресурсам, следуя инструкциям из этой базы знаний: http://support.microsoft.com/kb/319292

person Ray Booysen    schedule 08.02.2009

если вы просто хотите хранить несколько файлов в одном файловом хранилище (и извлекать файлы оттуда, взаимодействовать и т. д.), вы также можете проверить NFileStorage, .net файловое хранилище. написан на 100% .NET C# со всеми исходными кодами. Он также поставляется с интерпретатором командной строки, который позволяет взаимодействовать из командной строки.

person Community    schedule 27.04.2009