Frage

Ich bin mit COM-Interop. Ich habe einen Anruf in VB6, die eine Reihe von etwa 13000 Zeichen zurückgibt. Wenn ich den Anruf in reiner VB6 ausführen es etwa 800ms dauert auszuführen. Wenn ich es über C # und COM Interop ausführen dauert es etwa 8 Sekunden. Ich gehe davon aus der Verzögerung durch Serialisieren verursacht.

Wenn ich über Serialisieren richtig bin, würde ich Ihnen dankbar, wenn jemand auf dem schnellsten Weg vorschlagen könnte ich dies in C # bekommen. z.B. Wäre es besser, a) aussetzen als Byte-Array b) eine byref String param in die VB6 Schicht

würde ich einige Beispiel-Code schätzen auch. Ich versuchte, die

Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0)

ohne Erfolg.

-

Nach dem von Franci Kommentar auf. Ich Referenzierung einfach die VB6-DLL (so in Prozess) von einem C # dll. Hier ist ein Auszug aus OLEView

interface _MyCOMObect : IDispatch {
        ...
        [id(0x60030006)]
        HRESULT GetString(
                        [in] _IEventHistory* p_oEventHistory, 
                        [out, retval] _IXML** );
        ...
    };

    [
      uuid(09A06762-5322-4DC1-90DD-321D4EFC9C3E),
      version(1.0),
        custom({17093CC6-9BD2-11CF-AA4F-304BF89C0001}, "0")
    ]
    coclass MyCOMObject {
        [default] interface _CFactory;
    };

    [
      odl,
      uuid(C6E7413F-C63A-43E4-8B67-6AEAD132F5E5),
      version(1.0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]

soll ich wahrscheinlich darauf hinweisen, dass der Parameter (p_oEventHistory) ist ein weiteres COM-Objekt, das ich in C # bin Instanziieren aber das dauert etwa 80 ms

S

War es hilfreich?

Lösung

Ein paar Dinge: -

  1. Meine VB6 ist ein wenig rostig, aber Ihr IDL Auszug schlägt die GetString-Methode gibt tatsächlich ein Objekt, dass Geräte der IXML Schnittstelle. Ich bin ein bisschen überrascht, dass Marshal.PtrToStringAuto etwas Sinnvolles damit tun können. Könnten Sie die VB6 so ändern, dass es etwas vom Typ String tatsächlich gibt?

  2. Die Wirkung von COM + ist potenziell enorm. Ich würde vorschlagen, dass Sie zunächst Timings für den ersten Aufruf im Vergleich zu nachfolgenden Aufrufen vergleichen. COM + benötigen einen Host-Prozess für Ihre VB6 Komponente das erste Mal drehen bis sie aufgerufen wird so der erste Anruf immer noch schmerzhafter ist. Hinweis: Dies ist auf den ersten Aufruf geschieht, nicht auf Objektinstanziierung. Zweitens ist die Art und Weise Ihrer Komponente in COM + konfiguriert ist, kann einen großen Unterschied machen; wenn Sie alle COM + Dienste zu deaktivieren, dass Sie nicht wirklich benötigen (z Transaktionen) Sie könnten in der Lage sein, einige der Abhörlogik zu entfernen, dass COM + Plätze um alle Methodenaufrufe. wenn Sie letztlich nicht die Dienste benötigen, dass COM + bietet, verwenden Sie es nicht.

Andere Tipps

Ich würde Speicher mit Mapped-Dateien oder Named Pipes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top