Я дам вам ответы, но вы, кажется, уже понимаете, что происходит.
Мой вопрос: каковы функциональные различия между этими двумя методами?
Между этими двумя методами нет функциональной разницы.В первом методе (который вы должны использовать, если это вообще возможно), платформа DotNet обрабатывает все для вас.Под капотом он делает именно то, что вы делаете вручную: звоните LoadLibrary
, GetProcAddress
, а в какой-то момент FreeLibrary
.Это шаги к вызову функции в DLL.
Метод № 1 должен опираться на окна, управляющие DLL в фоновом режиме для меня, если это необходимо?Могут ли Windows загружать и выгружать dll без моего ведома?
Да, именно так, хотя я бы не сказал, что без вашего ведома.Вы говорите это делать, когда пишете [DllImport("PComm32.dll"...)]
.
Метод # 2. DLL загружается явно, когда я вызываю LoadLibrary.Библиотека остается в памяти до тех пор, пока я ее не освобожу?
Опять же, да, вы понимаете, что происходит.
Поскольку вы, кажется, ответили на свои вопросы, а я лишь подтвердил ваши ответы, позвольте вам объяснить, почему вы должны (почти) всегда использовать # 1:
- Работает так же хорошо
- Его проще в использовании и легче читать / поддерживать
- Нет смысла делать это трудным способом (# 2)
Я могу вспомнить только одну причину, по которой вам может понадобиться второй способ: если вам нужно было иметь возможность заменить DLL на лету, более новой версией или чем-то другим, не выходя из приложения, тогдаВы хотели бы получить точный контроль зерна при выгрузке DLL (чтобы файл мог быть заменен).
Это вряд ли будет требованием, за исключением очень особых случаев.
Bottom LineЕсли вы используете C #, вы принимаете тот факт, что вы даете контроль над инфраструктурой в обмен на возможность сосредоточиться на работе, а не беспокоиться о таких вещах, как DLL или управление памятью.Среда DotNet - это ваш друг, пусть она сделает за вас тяжелую работу и сосредоточит ваши усилия на остальной части кода.