Решено: Как подключить dll из ресурсов?

Приветствую всех, не секрет иногда все мы используем сторонние библиотеки, и порой нарушая их условия использования, скрываем в недрах нашего приложения. Или же мы просто не хотим таскать их за своим приложением exe, что бы они не мозолили глаза. В таком случаи мы можем их добавить в сборку и использовать методы и классы находящиеся внутри них. Сделать это можно следующим способом.

Добавляем dll в папку ресурсы:

Допусти мы имеет dll в моем случаи у нее содержимое такое:

Теперь мы добавим нашу dll в новый проект, сделать это можно следующим образом:

Выделить наш проект, нажав правую кнопку мыши выбрать свойство.

Нажмите расширяющий значок треугольника и выберите Добавить существующий фаил. Теперь укажите ваш dll он добавится в ресурсы.

После чего вам нужно его сохранить, для этого выберите пункт меню Фаил и Сохранить выбранные элементы.

Теперь мы можем закрыть, это окно, а в обозревателе решений мы должны увидеть :

На этом все, наша dll находится внутри сборки, однако нам теперь нужно ее как то использовать, а вот для этого имеется несколько вариантов.

1. Вариант с помощью Рефлексии:

Не достатком такого варианта это отсутствие intellisense при работе с dll, нам необходимо знать метод вызываемый, класс и пространство имен. Хотя это можно узнать все и через Рефлексию, так же. Однако если проект очень большой и использует большое количество dll, может стать препятствием.

2. Вариант с помощью AppDomain подменить утерянные ссылки на dll.

  • Первый вариант с использованием winform

У нас имеется тот же класс в dll :

Описанным выше примере, мы добавляем в ресурсы dll, и указываем как обычно ссылку на ее месторасположения, продолжая работать словно так как будто ничего не предвещает.

Однако нам придется создать событие и обработать ее, пример ниже показывает как это сделать:

Собираем проект, и переносим наш exe куда угодно. При запуске приложения сработает событие, из за того, что не был обнаружен фаил dll который мы указывали когда добавляли ссылку на него. И внутри обработчика событий у нас происходит подмена ссылок, а программа продолжает свою работу.

Не забудьте в свойствах dll изменить действие при сборке на Внедренный ресурс.

  • Теперь рассмотрим другой вариант с Console:

Из за особенностей работы метода Main, а именно то что она начинает работать самым первым, в нем нельзя подписываться на событие иначе, обработка события не произойдет. Для решения этого есть два варианта либо так :

используя статический конструктор, который отработает раньше метода Main

либо вот так:

Создав вспомогательный метод вынеся в него работу метода из dll

3. Выгрузить все DLL рядом с exe после запуска.

Однако этот вариант работает только с не управляемым кодом который написан на C++, и нам не походит.

4. Вариант заключительный ля объеденения dll в одну сборку exe использовать Costura.Fody Так же описывать не стал, слишком много примеров.

5. С помощью ILMerge, данный вариант я описывать не стал привожу ссылку на статью;

Обновлено: 19.07.2018 — 06:44

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.