C # проверить, доступен ли COM-объект перед выполнением каких-либо действий с ними - PullRequest
4 голосов
/ 30 января 2010

Как я могу проверить, существует ли COM-объект (зарегистрирован / доступен / может работать без проблем) перед запуском действий с их использованием?

Мое приложение должно использовать COM других приложений (InteropServices), но перед тем, как начать какое-либо действие, я хотел бы проверить, могу ли я создавать COM-объекты.

Это не будет проблемой, если COM находятся в одном каталоге, но это не так.

В пробы. Я хотел бы проверить, если что-то вроде этого:

CDNBase.ApplicationClass App = new CDNBase.ApplicationClass();

вызовет ловимые исключения или что-то в этом роде. Чем бы я мог создать красивый MessageBox и заблокировать некоторые события, пока он не будет исправлен. Любые другие решения, такие как проверка, существует ли пространство имен или sth, также хороши (я думаю: D)

Я пытался использовать try / catch, но это не удалось, Google не принес мне ничего особенного, поэтому я прошу вашей помощи.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 30 января 2010

Никто не любит видеть сообщение об ошибке. Но это особый случай, не делай этого. Активация COM всегда была трудна для устранения проблем. Но недавние разработки, такие как 64-разрядные операционные системы, виртуализация реестра, перенаправление реестра и контроль учетных записей, экспоненциально увеличили число способов, которыми он может не работать.

Самое последнее, что нужно ИТ-персоналу вашего клиента, это еще один уровень кода, который молча меняет правила активации или подавляет диагностическую информацию. Они подстрелят вас, если это не сработает, и не поймут, почему.

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

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

1 голос
/ 30 января 2010

Вы пытались поймать ComException:

try
{
...
}
catch(System.Runtime.InteropServices.COMException ex)
{
    // log error message
    throw;
}

ОБНОВЛЕНИЕ : извинения, я не предлагал подавить исключение. Обновили.

Кроме того, вы можете выполнить поиск в реестре для компонента ClassID:

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32 

Значение по умолчанию будет содержать полный путь файловой системы к DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...