.Net com сервер перехватывает необработанное исключение - PullRequest
1 голос
/ 15 апреля 2011

Я создал сервер Com в C #.Тип проекта - библиотека классов.Есть ли способ получить событие для необработанных исключений в моем коде?Я попробовал AppDomain.CurrentDomain.UnhandledException без удачи

Ответы [ 2 ]

4 голосов
/ 16 апреля 2011

Не возможно. Код поддержки взаимодействия COM в CLR реализует ограничение в COM, которое исключает возможность исключения из метода COM. Ваш метод будет вызываться с обработчиком исключений catch-all внутри CLR, который перехватывает любое выбрасываемое вами исключение. Он переводится в код ошибки COM, HRESULT, значение возврата любого метода интерфейса, совместимого с COM Automation. Значение Exception.HResult. Код COM-клиента использует это значение, чтобы определить, произошел ли сбой вызова метода.

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

3 голосов
/ 16 апреля 2011

Поскольку это невозможно, как описано в ответе Ханса Пассанта, и поскольку полезная информация, такая как трассировка стека, теряется при преобразовании исключения в COM HRESULT, я часто использую явную реализацию интерфейса, чтобы гарантировать, что исключения регистрируются, когда мойБиблиотека ComVisible вызывается из COM-клиента.Немного работы, но COM-интерфейсы, как правило, стабильны, поэтому это делается только один раз.

Например:

[ComVisible(true)]
public interface IMyClass
{
    void MyMethod();
    ...
}

[
ComVisible(true),
ClassInterface(ClassInterfaceType.None)
]
public MyClass : IMyClass
{
    ...

    public MyMethod()
    {
        ... implementation 
    }

    void IMyClass.MyMethod()
    {
        try
        {
            this.MyMethod();
        }
        catch(Exception ex)
        {
            _logger.Log(ex);
            throw;
        }

    }
}
...