2009-02-21 8 views
6

Кто-нибудь знает, как я могу вставить exe-файл в dll?Встраивается * .exe в dll

У меня есть инструмент, который является exe-файлом, который я вызываю из кода C#.

Дело в том, что я хочу иметь 1 dll, содержащую этот инструмент (exe-файл) и dll, содержащий мой код C#.

Возможно ли внедрить этот файл exe в ресурсы?

Thx заблаговременно

+0

Я удалил тег «встроенный», так как этот вопрос не имеет отношения к встроенным системам. –

ответ

9

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

Какой тип IDE/язык вы используете?

[EDIT]

Извините! вы упоминали, что используете C#.

  1. Добавить файл ресурса вашего приложения (щелкните правой кнопкой мыши приложение в среде IDE и выберите «Добавить новый элемент».
  2. Используйте панель инструментов в редакторе ресурсов, чтобы добавить существующий файл.
  3. Затем извлечь ехе когда это требует вызова кода что-то вроде: System.IO.File.WriteAllBytes (@ "C: \ MyEXE \", Resource1.MyEXE);
+1

Правила идут, за исключением того, что вы можете загрузить сборку из байта [], поэтому нет необходимости создавать файл. – leppie

+0

Те же правила идут, .... (oops typo) – leppie

+0

thx для вашего ответа Так что, наконец, мне нужно будет записать его в файловой системе, чтобы его выполнить? нет возможности выполнить его без этого? – GillouX

7

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

Лучше оставить .EXE в файловой системе и быть прозрачным в отношении того, что делает ваше приложение.

+5

Это действительно не проблема. Если пользователь запускает мою DLL, они, очевидно, доверяют мне. Кроме того, вы когда-либо просматривали все вспомогательные исполняемые файлы, запущенные приложениями, которые вы используете? – tster

2

Вы можете загрузить сборку с байта []. Это можно получить с помощью ManifestResourceStream встроенного ресурса.

1

Альтернативой может быть не встраивание самого .exe, а скорее включение его функций в dll и использование rundll32 [1] для его выполнения.

+0

Это был бы мой выбор тоже ... пока я не прочитал это сообщение «Старая новая вещь»: [Что подсказывает, когда использовать rundll32? Легко: не используйте его] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/04/10382242.aspx) –

+0

@ VáclavSlavík: ссылка сломана; [здесь новый] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). – hydroiodic

-1

На стороне заметьте, помните, что когда вы вытаскиваете файл из своих ресурсов на диск и затем выполняете код на нем, вы можете инициировать Windows Data Execution Prevention - в основном, Windows пытается автоматически определить, должно ли что-то быть кодом или данными , и если это похоже на данные (которые будут иметь ресурсы), то это предотвратит выполнение этих данных как код.

Это становится особенно липкой проблемой, если ваша сборка .NET будет использоваться по сети вместо локального диска - есть всевозможные конфигурации безопасности .NET, которые могут помешать этому работать правильно.

Еще один вариант, не зная деталей вашего проекта, возьмите это с солью: добавьте файл .exe.readme к вашей установке, который описывает любые любопытные пользователи или ИТ-специалисты, почему существует исполняемый файл, который они использовали Ожидание в каталоге установки:

+0

Это ... интересно запутанное описание DEP. Нет, DEP действительно не волшебным образом помечает исполняемые файлы на диске, поступающие из вилки ресурсов и, следовательно, не исполняемые. И нет, DEP не пытается «обнаружить» что-либо. Вместо этого это механизм для маркировки страниц памяти как исполняемых или неисполняемых. –

Смежные вопросы