2012-07-01 2 views
0

Итак, я создаю индивидуальный установщик для моего проекта, и мне нужно было «упаковать» все в один файл. (Я не мог использовать ILMerge или .NETZ, потому что одна из вещей, которые мне пришлось включить, была неуправляемой (это было так, как ее называли?) Сборка.) В любом случае, я читал много материала в основном отсюда, и люди были заявив, что нужно сделать это:Неисправности при чтении встроенной сборки (.dll)

  • Добавить .dll как встроенный ресурс;
  • Добавить обработчик метода AssemblyResolve, чтобы он срабатывал, когда мое приложение не может найти сборку
  • В этом обработчике заставьте его загрузить .dll из памяти с помощью функции, которая передает входной поток в массив байтов которые может использовать Assembly.Load().

Я сделал все это, и я добавил нормальную ссылку на .dll, поэтому мой код может скомпилироваться должным образом. Однако, когда я удаляю DLL-файл из каталога, в котором находится приложение, и пытаюсь запустить его, диалоговое окно «Не удалось загрузить файл или сборку ...» (или что бы это ни было, вы знаете, о чем я говорю) всплывает и говорит мне, что она не может загрузить мою .dll, хотя я явно сказал ей загрузить ее из этого массива байтов в AssemblyResolve EventHandler.
Прошу прощения, если это то, на что был дан ответ раньше. Если посмотреть на рекомендуемые подобные вопросы, я не могу ответить на этот вопрос.
Единственное, что я мог видеть, это может быть связано с тем, что «C# не позволяет мне загружать из байтов, если только я не в контексте высокой безопасности». Если кто-нибудь знает что-нибудь, можете ли вы подтвердить/опровергнуть это заявление и рассказать мне, что такое «контекст высокой безопасности»? Я признаю, что я новичок в сложных вещах. :)

Заранее благодарим за ваше время и ответы!

ответ

1

Сборка - это другое имя для управляемой dll - родной dll's не попадет в bitAccessA AssemblyResolve. Я не знаю, есть ли другой вариант, но при сохранении встроенной dll на диск при запуске, но я не нашел возможности сообщить OS (которая отвечает за загрузку неуправляемых dll), как найти встроенную dll.

+0

"родной" dll равен "managed" dll, так ли это? О, ну, пользователь, который сказал об этом в контексте безопасности, также сказал, что нет никакой проблемы, если сборка была потоковой на диск, а затем загружена оттуда с помощью 'Assembly.Load (filename);'. Я дам этот метод выстрелу, мы увидим ... – Lumos

+0

«управляемый», а «сборка» в этом случае - .NET-dll. «неуправляемые» и «родные» - это не .NET DLL. Термин «native» означает, что dll нельзя использовать на разных платформах, где .NET dll не являются специфичными для платформы. –

+0

@ C.Evenhuis Расположение dll должно либо находиться в переменной PATH среды, либо в месте, где выполняется приложение. Лучший способ поиска мест, где ОС пытается выполнить поиск в DLL, - это использовать ProcMon sysinternal (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx), отслеживая активность чтения/записи файла приложения обработать. –