2009-05-24 17 views
1

Ich konsumiere ein cpp COM-Objekt aus C# -Code. Mein C# Code sieht wie folgt aus:COM-Ausnahmen in C#

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

jedoch die Ausnahme nie irgendwelche Details I enthält in cpp gesetzt, insbesondere meine Fehlermeldung.

In meiner cav Seite Ich habe mehrere Beispiele folgte ich im Web gefunden haben:

... 
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 
... 

Bin ich etwas fehlt? Gibt es noch etwas, das das beeinflussen könnte, wie das Marshalling, die Interop-Erstellung oder die Attribute des Com-Servers selbst?

Antwort

6

Hat Ihre COM-Klasse Unterstützung ISupportErrorInfo?

+0

+1 Das ist eine interessante Vermutung. Ich kann sehen, wie sich Beispiele im Web auf die Details konzentrieren und vernachlässigen, dass Sie Ihre Klasse mit ISupportErrorInfo markieren müssen. –

-1

Statt den Ausnahmetyp zu fangen, COMException Art wie diese fangen ...

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

Da COMException von System.Exception abgeleitet ist, macht dies keinen Unterschied in Bezug auf die Ausnahmedetails. Es ist nur ein spezifischer Filter. –

+0

Die Kindklasse hat mehr Informationen als die Basisklasse. Relevante Informationen zu COM-Ausnahmen. Ich verstehe deinen Standpunkt überhaupt nicht. –

+1

COMException (oder genauer seine Basis ExternalException) hat nur ein zusätzliches Mitglied, das ErrorCode ist. Dieses Mitglied enthält das HRESULT des Fehlers. HRESULT wird jedoch auch in den Eigenschaften Message und HResult von System.Exception enthalten sein. –

2

Angenommen, Ihre Klasse implementiert ISupportErrorInfo, haben Sie zufällig die Unterstützung hinzugefügt NACH Sie die Bibliothek in Ihr C# -Projekt von Visual Studio importiert?

Visual Studio generiert das Gunk, das es benötigt, um mit einer COM-Bibliothek nur einmal zu kommunizieren, wenn Sie die Bibliothek importieren. Zu diesem Zweck erstellt es eine spezielle Übersetzungs-DLL mit dem Namen "originalDllName .Interop.dll", basierend auf den Informationen, die zum Zeitpunkt des Imports in der TypeLib der DLL verfügbar sind.

Sie können Implementierungsänderungen beliebig oft vornehmen; Aber wenn Sie die Bibliothek in irgendeiner Weise geändert haben (neue Klassen hinzugefügt, die Schnittstellendefinitionen geändert, die von Ihren Klassen implementierten Iterfaces geändert), müssen Sie die COM-DLL aus Ihren Referenzen entfernen und sie dann erneut importieren. damit die Interop-DLL aktualisiert wird.