Domanda

Sto usando COM Interop. Ho una chiamata in VB6 che restituisce una stringa di circa 13000 caratteri. Se eseguo la chiamata in puro VB6 ci vogliono circa 800ms per l'esecuzione. Se eseguo tramite C # e COM Interop ci vogliono circa 8 secondi. Sto assumendo il ritardo è causato da marshalling.

Se ho ragione su marshalling, sarei grato se qualcuno potrebbe suggerire il modo più veloce che posso ottenere questo in C #. per esempio. Sarebbe meglio a) esporre come un array di byte b) fornire un param stringa byref nello strato VB6

Gradirei alcuni esempi di codice pure. Ho provato il

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

senza alcun risultato.

-

In seguito al commento di Franci. Sto semplicemente riferimento al dll VB6 (così nel processo) da un C # dll. Ecco un estratto da 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
    ]

Probabilmente dovrei sottolineare che il parametro (p_oEventHistory) è un altro oggetto COM che sto istanziare in C #, ma che dura circa 80ms

S

È stato utile?

Soluzione

Un paio di cose: -

  1. Il mio VB6 è un po 'arrugginito, ma il vostro estratto IDL suggerisce il metodo GetString in realtà restituisce un oggetto che implementa l'interfaccia iXML. Sono un po 'sorpreso che Marshal.PtrToStringAuto può fare qualcosa di utile con questo. Potrebbe cambiare il VB6 in modo che in realtà restituisce qualcosa di tipo String?

  2. L'effetto di COM + è potenzialmente enorme. In primo luogo vorrei suggerire che si confronta tempi per la prima invocazione contro invocazioni successive. COM + avrà bisogno di girare un processo host per il componente VB6 la prima volta che viene invocato in modo che la prima chiamata è sempre più doloroso. Nota questo avviene prima chiamata, non su istanza di oggetto. In secondo luogo, il modo in cui il componente è configurato in COM + può fare una grande differenza troppo; se si disattiva tutti i servizi COM + che in realtà non è necessario (ad esempio transazioni) si potrebbe essere in grado di rimuovere alcuni dei logica intercettazioni che COM + posti in giro per tutte le chiamate di metodo. In definitiva, se non è necessario che i servizi COM + fornisce, non utilizzarlo.

Altri suggerimenti

Vorrei considerare l'utilizzo di memoria file mappati o named pipe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top