2011-01-30 2 views
1

Я загрузке COM DLL с помощью этого метода:Должен ли я освобождать загруженный модуль при утилизации объекта?

[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] 
private extern static IntPtr LoadLibrary(string librayName); 

Должен ли я освободить библиотеку DLL с помощью:

[DllImport("kernel32", SetLastError = true)] 
private static extern bool FreeLibrary(IntPtr hModule); 

или просто дайте терминации приложение справиться?

ответ

4

Вы должны позвонить FreeLibrary, когда закончите использовать DLL, загруженную с помощью LoadLibrary. Это не будет проблемой, если ваше приложение не работает долгое время, и вы загружаете многие из этих DLL или если вы не захотите обновлять DLL на диске (он будет заблокирован до тех пор, пока он загружен).

Кстати, почему вы используете LoadLibrary для загрузки COM-DLL и не используете TLBIMP для создания .NET-доступной оболочки?

+0

+1 И чтобы немного разъяснить, * только * освободите те библиотеки DLL, которые вы загрузили с помощью 'LoadLibrary'. Вы не должны освобождать любую из системных DLL, таких как «system32», «kernel32» и т. Д., * Или * любые DLL-файлы, чей дескриптор вы получаете с помощью «GetModuleHandle». Подробнее см. [Документация] (http://msdn.microsoft.com/en-us/library/ms683152.aspx). –

+0

Я использую TLBIMP, но я не люблю обрабатывать un \ регистрации моих COM-объектов при развертывании каждой версии. – HuBeZa

+0

@HuBeZa: Вы должны * использовать установщик, который позаботится об этом для вас. Выполнение этого вручную - гигантская боль в тылу. Но программа установки фактически упростит управление версиями, а не сложнее. –