Включить неуправляемый EXE-файл как ресурс в управляемый код C # - PullRequest
2 голосов
/ 05 марта 2012

У меня есть заданный код, написанный на неуправляемом C ++, который я добавил как ресурс в программе на C #.

При попытке загрузить неуправляемый EXE-файл с использованием Assembly.Load я получаю BadImageFormatException, чье InnerException говоритчто «формат IL неверен» (очевидно).

Как я могу заставить эту работу работать?

Я знаю, что использование кода в качестве DLL было бы лучше, но по какой-то причинеВызов dll не ведет себя так же, как при запуске неуправляемого exe-файла с System.Diagnostics.Process.Start.

И я не хочу иметь два отдельных файла EXE.Есть идеи?


РЕДАКТИРОВАТЬ: ОК, мне больше не нужно это делать.Мой dll вел себя по-другому, потому что я использовал его в другом контексте (winform вместо console);поэтому функция, вызывающая проблему, SetThreadDesktop, не может работать должным образом.Собираюсь закрыть пост сейчас, спасибо всем, кто ответил.

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

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

2 голосов
/ 05 марта 2012

Если у вас есть неуправляемая DLL в качестве ресурса - основные шаги:

0 голосов
/ 04 мая 2018

Немного другой подход, который может быть автоматизирован, использует так называемое «сборочное плетение» Costura.Fody - https://github.com/Fody/Costura - это один из «ткачей». Процесс встраивания (с автоматизацией тестирования) для включения неуправляемых ресурсов и прозрачной загрузки их во время выполнения без особых усилий -

Install-Package Fody.Costura

Затем все встраивание, распаковка, определение местоположения сборки и загрузка автоматизируются по умолчанию и управляются включением конфигурации «FodyWeavers.xml», добавленной в ваш проект.

<Costura> <Unmanaged32Assemblies> Foo32 Bar32 </Unmanaged32Assemblies> <Unmanaged64Assemblies> Foo64 Bar64 </Unmanaged64Assemblies> </Costura>

Концепция, лежащая в основе подхода, - это статический загрузчик классов <Module>, который двоично изменяется в задачах проекта Fody после успешной сборки сборки проекта. Внутренне Mono.Cecil используется для статического внедрения загрузчика '<Module>', которое автоматически распаковывает ресурсы, сохраняет их во временную директорию, сообщая о необходимости загрузки DLL из этого места и т. Д. При событии загрузки сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...