Исключения COM в C # - PullRequest
1 голос
/ 24 мая 2009

Я использую COM-объект cpp из кода C #. Мой код c # выглядит так:

try
{
   var res = myComServer.GetSomething();
}
catch (Exception e) { }

Однако исключение никогда не содержит никаких данных, которые я установил в cpp, в частности, мое сообщение об ошибке.

В моей стороне cpp я следил за несколькими примерами, которые я нашел в сети:

...
ICreateErrorInfo *pcerrinfo;    
IErrorInfo *perrinfo;    
HRESULT hr;    
hr = CreateErrorInfo(&pcerrinfo);    
pcerrinfo->SetDescription(L"C++ Exception");    
hr = pcerrinfo->QueryInterface(IID_IErrorInfo, (LPVOID FAR*) &perrinfo);  
if (SUCCEEDED(hr))    
{  
  SetErrorInfo(0, perrinfo);  
  perrinfo->Release();    
}  

pcerrinfo->Release();    
return E_FAIL;  // E_FAIL or other appropriate failure code  
...

Я что-то упустил? Есть ли что-нибудь еще, что может повлиять на это, например, маршалинг, создание взаимодействия или атрибуты самого com-сервера?

Ответы [ 3 ]

6 голосов
/ 24 мая 2009

Поддерживает ли ваш COM-класс ISupportErrorInfo ?

2 голосов
/ 25 мая 2009

Предполагая, что ваш класс реализует ISupportErrorInfo, вы случайно не добавили поддержку ПОСЛЕ , когда вы импортировали библиотеку в проект C # из Visual Studio?

Visual Studio создает ганк, который требуется для общения с библиотекой COM только один раз, когда вы импортируете библиотеку. Для этой цели он создает специальную библиотеку перевода под названием « originalDllName .Interop.dll» на основе информации, доступной в TypeLib библиотеки DLL на момент импорта.

Вы можете вносить изменения в реализацию так часто, как хотите, без проблем; но если вы каким-либо образом изменили библиотеку (добавили новые классы, изменили определения интерфейса, изменили интерфейсы, реализованные вашими классами ...), вам придется удалить COM DLL из ваших ссылок, а затем повторно импортировать ее, для обновления Interop DLL.

0 голосов
/ 24 мая 2009

Вместо того, чтобы перехватывать тип Exception, ловите COMException type вроде этого ...

try
{
  // COM call
} 
catch( COMException cEx )
{
  // Check HRESULT here
}
...