Проверка наличия импортируемых dll
От: AntonAD  
Дата: 30.10.10 11:05
Оценка:
При программировании для win mobile достаточно часто в код приходится вносить строки типа
        [DllImport("coredll.dll")]

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

Как мне реализовать проверку наличия нужных мне внешних ресурсов?
Может какой нибудь хитрый try catch?
Re: Проверка наличия импортируемых dll
От: _FRED_ Черногория
Дата: 30.10.10 11:12
Оценка:
Здравствуйте, AntonAD, Вы писали:

AAD>При программировании для win mobile достаточно часто в код приходится вносить строки типа

AAD>        [DllImport("coredll.dll")]

AAD>Однако в некоторых типах устройств нужных мне dll может не быть. В этом случае программа должна продолжить работу, не задействовав те функции, которые завязаны на внешнюю dll.
AAD>Как мне реализовать проверку наличия нужных мне внешних ресурсов?
AAD>Может какой нибудь хитрый try catch?

Не нужно хитрого — самым обычным оборачивайте вызов вашего импортированного метода и ловите DllNotFoundException:
try {
  MyExternalMethod();
} catch(DllNotFoundException ex) {
  // Сборка не найдена
}//try
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Проверка наличия импортируемых dll
От: Pavel Dvorkin Россия  
Дата: 30.10.10 15:16
Оценка:
Здравствуйте, _FRED_, Вы писали:


_FR>Не нужно хитрого — самым обычным оборачивайте вызов вашего импортированного метода и ловите DllNotFoundException:

_FR>
_FR>try {
_FR>  MyExternalMethod();
_FR>} catch(DllNotFoundException ex) {
_FR>  // Сборка не найдена
_FR>}//try
_FR>


Я делал иначе


        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "LoadLibrary")]
        static extern IntPtr LoadLibrary(string lpFileName);

        public static bool Init()
        {
            IntPtr xDLL = LoadLibrary("X.DLL");
            return xDLL != IntPtr.Zero;
        }


После вызова Init известно, загрузилась или нет


            if (!x.Init())
            {
                MessageBox.Show("Can't load X.DLL", "Error");
                return;
            }


В этом случае обрабатывается не только ее отсутствие, но и любые проблемы, связанные с загрузкой. А их много бывает. Можно при желании GetLastError еще вызвать.
With best regards
Pavel Dvorkin
Re: Проверка наличия импортируемых dll
От: depend86  
Дата: 30.10.10 16:46
Оценка:
Здравствуйте, AntonAD, Вы писали:

AAD>При программировании для win mobile достаточно часто в код приходится вносить строки типа

AAD>
AAD>        [DllImport("coredll.dll")]

AAD>

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

AAD>Как мне реализовать проверку наличия нужных мне внешних ресурсов?

AAD>Может какой нибудь хитрый try catch?

обернуть DllImport'ы в #if .. #endif ? и собирать для каждой платформы\устройства с нужными директивами компилятора ?
Re[2]: Проверка наличия импортируемых dll
От: AntonAD  
Дата: 30.10.10 17:18
Оценка:
Здравствуйте, depend86, Вы писали:

D>обернуть DllImport'ы в #if .. #endif ? и собирать для каждой платформы\устройства с нужными директивами компилятора ?


Начинал именно так, но слишком много разных вариантов.
Re[2]: Проверка наличия импортируемых dll
От: AntonAD  
Дата: 30.10.10 17:19
Оценка:
_FR>Не нужно хитрого — самым обычным оборачивайте вызов вашего импортированного метода и ловите DllNotFoundException:
_FR>
_FR>try {
_FR>  MyExternalMethod();
_FR>} catch(DllNotFoundException ex) {
_FR>  // Сборка не найдена
_FR>}//try
_FR>

Спасибо
Re[3]: Проверка наличия импортируемых dll
От: AntonAD  
Дата: 30.10.10 17:19
Оценка:
PD>Я делал иначе


PD>
PD>        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "LoadLibrary")]
PD>        static extern IntPtr LoadLibrary(string lpFileName);

PD>        public static bool Init()
PD>        {
PD>            IntPtr xDLL = LoadLibrary("X.DLL");
PD>            return xDLL != IntPtr.Zero;
PD>        }

PD>


PD>После вызова Init известно, загрузилась или нет



PD>
PD>            if (!x.Init())
PD>            {
PD>                MessageBox.Show("Can't load X.DLL", "Error");
PD>                return;
PD>            }

PD>


PD>В этом случае обрабатывается не только ее отсутствие, но и любые проблемы, связанные с загрузкой. А их много бывает. Можно при желании GetLastError еще вызвать.



Спасибо
Re[3]: Проверка наличия импортируемых dll
От: IT Россия linq2db.com
Дата: 01.11.10 13:12
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>В этом случае обрабатывается не только ее отсутствие, но и любые проблемы, связанные с загрузкой. А их много бывает. Можно при желании GetLastError еще вызвать.


Ещё для порядка хорошо бы вызвать GetProcAddress.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.