Лучший способ выполнять функцию только при загрузке (.NET) DLL?

#c# #.net

#c# #dll

Вопрос:

Я не уверен, что это лучший способ объяснить это, поэтому, пожалуйста, оставляйте комментарии, если вы не понимаете.

В принципе, у меня есть несколько библиотек для различных задач для работы с разными программами — notification — это лишь один пример.

Сейчас я создаю новую программу, и я хочу, чтобы она была как можно более легкой. Хотя я хотел бы включить свой механизм уведомлений, я не думаю, что многие люди действительно будут использовать его функциональность, поэтому я бы предпочел не включать его по умолчанию — просто в качестве дополнительной загрузки.

Как бы я это запрограммировал?

С неуправляемыми библиотеками DLL и P / Invoke я могу в принципе обернуть все в цикл try / catch, но я не уверен в управляемой версии.

На данный момент лучший способ, который я могу придумать, — это проверить, существует ли файл DLL при запуске, затем задать поле bool или подобное, и каждый раз, когда я хотел бы, чтобы было запущено уведомление, я мог бы выполнить if / check bool и запустить…

Я видел из окна отладки, что DLL-файлы загружаются только по мере необходимости. Очевидно, что программа будет компилироваться, поскольку все компоненты будут видны проекту, но будет ли она выполняться на компьютере конечного пользователя без библиотеки DLL?

Что еще более важно, есть ли лучший способ сделать это?

В идеале я хотел бы ничего не иметь об уведомлениях в своем приложении и каким-то образом сделать так, чтобы при загрузке DLL-файла эта функциональность добавлялась извне. На самом деле это не конец света, если вызывается несколько дополнительных байтов notification("blabla"); (или что-то подобное), но я думаю намного дальше по линии, когда у меня гораздо большие намерения и я просто хочу знать лучшие практики для такого рода вещей.

Ответ №1:

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

Такие вещи обычно описываются как плагины (или дополнения, или расширения).

Начиная с .NET 4, стандартный способ сделать это — с помощью Managed Exensibility Framework. Она включена в фреймворк как System.ComponentModel.Composition сборка и пространство имен. Для начала лучше всего прочитать статью MSDN и руководство по программированию MEF.

Комментарии:

1. Я только недавно (последние два месяца) занялся серьезной разработкой на c #, в группе пользователей, членом которой я являюсь, были разговоры о MEF… Я просто хотел бы заниматься серьезным программированием тогда, поскольку это полностью вылетело у меня из головы — я понятия не имел, что это такое… После написания вопроса мне внезапно пришла в голову мысль о том, как написать расширение типа middleman, которое работало бы так, как я хочу… Тем не менее, я обязательно посмотрю на MEF, чтобы увидеть, делает ли он то, что мне нужно в первую очередь (если это не слишком сложно… Я все еще совсем новичок!)

Ответ №2:

Вы можете использовать System.Отражение.Assembly и ее метод LoadFile для динамической загрузки библиотеки DLL. Затем вы можете использовать методы в Assembly для получения классов, типов и т.д., встроенных в библиотеку DLL, и вызывать их.

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

Комментарии:

1. Тонкое различие, но вы также можете проверить, завершится ли загрузка успешно, не зная пути. Конфигурация привязки сборки может использоваться, например, для управления расположением каталога плагина без необходимости программе знать, как работает разрешение имен. Другими словами, код не должен зависеть от фактического файла физической сборки.

2. Я взгляну на систему. Отражение. Сборка — Спасибо …. … отредактировал пробелы в вашем ответе, поскольку в нем говорится, что я уже проголосовал и мне не разрешат голосовать… Я думаю, это связано с предыдущим отключением.

Ответ №3:

На ваш вопрос, будет ли программа запускаться на компьютере пользователя без уже имеющихся библиотек DLL — да, программа будет запускаться. Пока вы не делаете что-то, что требует времени выполнения для загрузки классов, определенных в библиотеке dll, не имеет значения, отсутствует ли библиотека DLL на компьютере. Что касается аспекта, который вы ищете в отношении загрузки библиотеки dll по требованию, я думаю, вам хорошо использовать какую-то конфигурацию и отражение (либо напрямую, либо с помощью какой-либо стратегии IoC ).

Ответ №4:

Попробуйте загрузить плагин при запуске.

Вместо того, чтобы повсеместно проверять логическое значение, вы можете создать поле делегирования для уведомления и инициализировать его функцией no-op. Если загрузка плагина прошла успешно, назначьте делегата реализации плагина. Тогда везде, где происходит событие, можно просто вызвать делегат, не беспокоясь о том, что плагин может быть доступен, а может и нет.