Ich habe eine C# DLL aufgerufen von Excel VBA, die ich über eine COM Callable Wrapper/COM Interop ausgesetzt. Ich möchte alle Ausnahmen, die in dem C# -Code auftreten, auf dem VBA-Client übergeben können. Gibt es dafür empfohlene Ansätze? Vielen Dank.Fehlerbehandlung in C#/VBA COM Interop
Antwort
Vor Jahren habe ich vage Erinnerungen an die Rückgabe von Fehlerinformationen über COM-Funktionsaufrufe. COM-Funktionen sollten keine Ausnahmen zurückgeben. Die Tatsache, dass in der COM-Funktion ein Fehler aufgetreten ist, wird durch den Rückgabewert signalisiert. S_OK (0) bedeutete Erfolg. negative Zahlen bedeuteten Versagen. Sie könnten verschiedene negative Zahlen verwenden, um grundlegende Fehlertypen zu übergeben. Für spezifischere Fehlerinformationen mussten Sie jedoch die IErrorInfo-Schnittstelle für das COM-Objekt implementieren.
Nachdem dies getan wurde, behandelten Visual Basic 6 und Visual Studio 2000 COM-Fehler in Visual Basic, jedoch ältere Versionen von VBA nicht korrekt.
Wenn jemand in letzter Zeit COM benutzt hat, kann er vielleicht die Details ausfüllen und korrigieren, wo mein Gedächtnis über die Jahre verschwommen ist.
Es fällt mir auf, dass die Implementierung eines neuen COM-Wrapper-Codes, der Ausnahmen in dokumentierte COM-Fehler übersetzt, keine einfache generische Sache wäre und dass eine handcodierte Version gemacht werden könnte, aber wiederum müssten Sie die COM-Programmierung verstehen.
Das Redesign Ihrer .NET-Objekte, sodass Fehlerdetails gemeldet wurden, indem Sie Ihre getlasterror() - Methode in Ihrem Objekt aufrufen, wäre eine sinnvolle Umgehungslösung.
Es ist möglich, eigene Ausnahmen zu erstellen, die HRESULT-Fehlercodes an VBA oder andere COM-basierte Anrufer zurückmelden. Hier ist ein Beispiel, das E_FAIL verwendet:
public class ComMessageException : Exception
{
public ComMessageException(string message)
:base(message)
{
HResult = unchecked((int)0x80004005);
}
}
Here is an MSDN article, die den Prozess beschreibt.
Dies sollte Ihnen die gleiche VBA-Fehler-Unterstützung, die Sie in VB6 hatten, wird es die Fehlermeldung Ihrer Wahl für den Benutzer zusammen mit dem HRESULT angezeigt, die Sie wählen.
- 1. appdomains in COM-Interop
- 2. COM Interop ohne regasm
- 3. Silverlight und COM Interop
- 4. Cross User COM Interop
- 5. Com Interop w/MSXML
- 6. .NET-Eigenschaften in COM Interop?
- 7. COM-Objekt Excel Interop aufräumen
- 8. COM Interop Reference Counting Guidelines
- 9. C# + COM Interop, deterministische Freigabe
- 10. CreateObject entspricht in C/C++? (COM Interop)
- 11. .Net COM Interop läuft COM-Instanz laufen und RCW zuweisen
- 12. COM-DLL-Pfad von Com Interop Assembly suchen
- 13. "Registrieren für COM Interop" vs "Make Assembly COM sichtbar"
- 14. COM Interop auf Windows Mobile 6
- 15. Interop zwischen MSXML und .Net mit COM +
- 16. Registration-Free COM Interop und abhängige Assemblies
- 17. COM-Interop-Side-by-Side-Assemblies
- 18. Was macht "Register for COM Interop" eigentlich?
- 19. VB6/COM Interop: Woher kommen diese Ereignisse?
- 20. COM Interop, das generische Typen verwendet
- 21. Excel COM Interop - tlbimp vs primäre WrapperTool
- 22. Erstellen Enumeration von WCF importiert wie in COM Interop
- 23. RCW & Referenzzählung bei Verwendung von COM-Interop in C#
- 24. Wie generiere ich COM-Interop-Proxies in C# -Quellcode?
- 25. Welche Auflistungsschnittstelle sollte ich in .NET für COM-Interop verwenden?
- 26. Warum ist COM-Interop gegenüber P/Invoke in .NET vorzuziehen?
- 27. Verwenden von Ref-Array-Parameter in C# mit COM-Interop
- 28. Zurückgeben eines Arrays von JS nach C# mit COM-Interop
- 29. Hosting einer .net-Baugruppe für COM-Interop mit langer Lebensdauer?
- 30. Side-by-Side-COM-Interop mit C# und VBA