2012-06-07 6 views
6

In unserem Projekt verwenden wir viel von Delphi-Code durch COM in unserer asp.net-Anwendung.Warum ist COM-Interop gegenüber P/Invoke in .NET vorzuziehen?

Gefallen Sie diesen: Legacy delphi dll => delphi COM-Wrapper => .NET-Interop => asp.net (MVC)

Wir haben einige Probleme in Bezug auf Zugriffsverletzungen, Entladen der DLL, etc ... Ich habe jetzt portierte einige, die Legacy-DLL direkt über P/Invoke-Code zu verwenden.

Wenn ich auf Ressourcen in Bezug auf COM und P/Invoke schaue, raten Leute fast immer, COM zu verwenden. Warum das? Nicht P/Invoke haben die folgenden Vorteile:

  • geprüft Code heraus wird immer die richtige DLL statt der zuletzt registrierten COM
  • Mehrere Versionen können nebeneinander auf den Servern (zum Beispiel laufen : DEV,
  • TEST und QA) Kommunikation
  • nicht mehr COM-Registrierungen Aufwand
  • Viele schneller als COM (Artikel I 30% Geschwindigkeitserhöhung zeigen)
+0

können Sie p/aufrufen in eine 32-Bit-DLL-Datei von einem 64-Bit-Prozess? Ich denke nicht. – Bond

+1

Könnten Sie einige Hinweise geben, die darauf hindeuten, dass COM P/Invoke bevorzugt wird? Ich stimme Ihnen sehr zu, dass P/Invoke die bessere Lösung ist, wenn sie verfügbar ist. Die meisten Interna in der .NET-BCL sind in Bezug auf P/Invoke auf die Win32-APIs implementiert. Der einzige Grund, COM Interop zu verwenden, ist, wo Sie keine Wahl haben, z.B. Interop mit Office-Anwendungen oder Windows-API-Teile, die nur COM sind. – Govert

+0

Remember DLL Hölle? Anstatt die richtige DLL zu verwenden, verwendet Ihr Code die erste verfügbare DLL mit dem gleichen Namen. Alle API-Änderungen werden erst zur Laufzeit erkannt, so dass eine Versionierung praktisch unmöglich ist. Sie können keine DLL erstellen, die sowohl ältere als auch neuere Clients bedient, ohne die Namen der Funktionen selbst zu ändern. –

Antwort

8

Pinvoke ist ein sehr schönes Werkzeug lesen, aber es ist sicherlich n o Ersatz für COM. Pinvoke unterstützt nur einfache Funktionen mit einer C-Syntax, mit COM können Sie ein Objektmodell implementieren. Nehmen wir zum Beispiel die Klassen in den Microsoft.Office.Interop-Namespaces, es sind reine COM-Klassen ohne Wrapper. Doing Office Interop mit Pinvoke wäre quälend schmerzhaft.

Ein weiteres Kernproblem bei pinvoke ist, dass es typischerweise die Last des Client-Programmierers ist, die Deklarationen zu schreiben. Die Person, die sie am wenigsten wahrnimmt. Ein COM-Autor kann eine automatisch generierte Typbibliothek ähnlich wie Metadaten in einer .NET-Assembly veröffentlichen. Drastische Eliminierung der Wahrscheinlichkeit für Fehler und keine Arbeit, die vom Client-Programmierer über Project + Add Reference hinaus benötigt wird.

Addressing Ihre Kugeln:

  • geprüft Code heraus wird immer die richtige DLL statt der zuletzt registrierten COM verwenden
    Sie sind den Launen von Windows noch unter dem Vorbehalt der richtigen DLL zu finden. Der einzige gute Weg, um Unfälle zu vermeiden, ist das Speichern der DLL im selben Verzeichnis wie die EXE. Welches ist durchaus möglich, auch in COM, alles, was Sie tun müssen, ist eine leere Datei mit dem

  • Mehrere Versionen yourapp.exe.local Namen erstellen können nebeneinander auf den Servern laufen (zum Beispiel: DEV, TEST und QA)
    kein Problem in COM entweder unter Verwendung der oben genannte Technik oder durch eine reg frei manifest

  • keine COM-Registrierungen Ärger mit
    verwenden Sie ein reg frei manifest so ist keine Registrierung erforderlich. Sehr einfach zu tun, setzen Sie einfach die Isolierte Eigenschaft der Referenz auf True.

  • Viel schneller als COM-Kommunikation (Artikel I zeigen eine 30% Geschwindigkeitserhöhung lesen)
    Es ist viel langsamer als COM. Sie können zusätzliche Kosten verursachen, indem Sie spät gebundene COM-Anrufe über IDispatch tätigen, das ist ungefähr so ​​teuer wie ein Pin-Voicefall.


Es gibt einen dritten Weg nativen Code Interop zu tun: ein verwaltetes Wrapper-Klasse in der C++/CLI Sprache zu schreiben. Die im .NET-Framework verwendete Technik, insbesondere in mscorlib.dll, System.Data und PresentationFramework, Assemblys, die starke Abhängigkeiten von systemeigenem Code aufweisen. Nicht sehr geeignet für Delphi, es funktioniert am besten für nativen Code, der leicht aus C oder C++ aufgerufen werden kann.

+0

Große Antwort. Ich habe versucht, ein Reg-frei-Manifest, aber konnte es nicht zum Arbeiten, zumindest nicht aus Visual Studio (isolierte Eigenschaft). Ich bin mir nicht sicher, wie "yourapp.exe.local" das Verhalten der Suche nach der richtigen COM ändert? – Cohen

+0

Ich weiß nicht, wie man "es funktioniert nicht" Fragen beantwortet. Die .local-Datei weist den Windows-Loader lediglich an, nur in das Verzeichnis zu suchen, das die EXE-Datei enthält, und zwar unabhängig vom Pfad, der im Registrierungsschlüssel angegeben ist. Grob und kein Ersatz für ein Manifest, aber es kann sicherlich nützlich sein. –

+0

"Es funktioniert nicht" -Fragen. Ich verstehe. Ich muss mehr in Manifest-Dateien schauen. Ich denke nicht, dass das .local eine Lösung in einer asp.net Umgebung sein würde. Die Exe wäre in diesem Fall der IIS-Arbeitsprozess, wenn ich mich nicht irre? – Cohen