Итак, я создаю индивидуальный установщик для моего проекта, и мне нужно было «упаковать» все в один файл. (Я не мог использовать ILMerge или .NETZ, потому что одна из вещей, которые мне пришлось включить, была неуправляемой (это было так, как ее называли?) Сборка.) В любом случае, я читал много материала в основном отсюда, и люди были заявив, что нужно сделать это:Неисправности при чтении встроенной сборки (.dll)
- Добавить .dll как встроенный ресурс;
- Добавить обработчик метода AssemblyResolve, чтобы он срабатывал, когда мое приложение не может найти сборку
- В этом обработчике заставьте его загрузить .dll из памяти с помощью функции, которая передает входной поток в массив байтов которые может использовать Assembly.Load().
Я сделал все это, и я добавил нормальную ссылку на .dll, поэтому мой код может скомпилироваться должным образом. Однако, когда я удаляю DLL-файл из каталога, в котором находится приложение, и пытаюсь запустить его, диалоговое окно «Не удалось загрузить файл или сборку ...» (или что бы это ни было, вы знаете, о чем я говорю) всплывает и говорит мне, что она не может загрузить мою .dll, хотя я явно сказал ей загрузить ее из этого массива байтов в AssemblyResolve EventHandler.
Прошу прощения, если это то, на что был дан ответ раньше. Если посмотреть на рекомендуемые подобные вопросы, я не могу ответить на этот вопрос.
Единственное, что я мог видеть, это может быть связано с тем, что «C# не позволяет мне загружать из байтов, если только я не в контексте высокой безопасности». Если кто-нибудь знает что-нибудь, можете ли вы подтвердить/опровергнуть это заявление и рассказать мне, что такое «контекст высокой безопасности»? Я признаю, что я новичок в сложных вещах. :)
Заранее благодарим за ваше время и ответы!
"родной" dll равен "managed" dll, так ли это? О, ну, пользователь, который сказал об этом в контексте безопасности, также сказал, что нет никакой проблемы, если сборка была потоковой на диск, а затем загружена оттуда с помощью 'Assembly.Load (filename);'. Я дам этот метод выстрелу, мы увидим ... – Lumos
«управляемый», а «сборка» в этом случае - .NET-dll. «неуправляемые» и «родные» - это не .NET DLL. Термин «native» означает, что dll нельзя использовать на разных платформах, где .NET dll не являются специфичными для платформы. –
@ C.Evenhuis Расположение dll должно либо находиться в переменной PATH среды, либо в месте, где выполняется приложение. Лучший способ поиска мест, где ОС пытается выполнить поиск в DLL, - это использовать ProcMon sysinternal (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx), отслеживая активность чтения/записи файла приложения обработать. –