2010-03-30 13 views
7

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 da eseguire. Se lo eseguo tramite C# e COM Interop ci vogliono circa 8 secondi. Suppongo che il ritardo sia causato dal marshalling.Il modo più veloce per accedere alla stringa VB6 in C#

Se sono corretto sul marshalling, sarei grato se qualcuno potesse suggerire il modo più veloce per farlo in C#. per esempio. Sarebbe preferibile a) esporre come byte matrice b) fornire un byref param stringa nello strato VB6

Gradirei alcuni esempi di codice pure. Ho provato il

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

inutilmente.

-

In seguito al commento di Franci. Sto semplicemente facendo riferimento alla DLL VB6 (così in corso) da una DLL C#. Ecco un estratto dal 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 Tengo a precisare che il parametro (p_oEventHistory) è un altro oggetto COM che sto istanziare in C#, ma che richiede circa 80ms

S

+0

Potrebbe essere utile fornire alcuni dettagli sul codice VB6 e C#. Il componente VB6 è un server out-of-proc o inproc? Qual è il frammento TLB effettivo per l'oggetto e la proprietà a cui si sta accedendo. La chiamata passa attraverso IDispatch o una regolare interfaccia COM? Stai utilizzando il marshaller OLE standard o un proxy/stub personalizzato o persino un marshaller personalizzato? –

+0

Quindi sono riuscito a radere 1 sec di tempo non iniettando un oggetto COM nella chiamata COM (tramite il parametro) ma facendo tutto dal lato COM delle cose. MA 7 secondi sembra ancora eccessivo per il trasferimento di 13000 caratteri! –

+1

C'è qualcos'altro. Il marshalling di un BSTR richiede microsecondi, non secondi. Dovresti eseguire il debug del codice VB6, impostare C# exe come programma di avvio. –

risposta

2

Un paio di cose: -

  1. 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 sorpreso che Marshal.PtrToStringAuto possa fare qualcosa di utile con questo. Potresti cambiare il VB6 in modo che restituisca qualcosa di tipo String?

  2. L'effetto di COM + è potenzialmente enorme. In primo luogo, suggerirei di confrontare i tempi per la prima invocazione rispetto alle successive invocazioni. COM + dovrà avviare un processo host per il componente VB6 la prima volta che viene richiamato in modo che la prima chiamata sia sempre più dolorosa. Nota che questo succede alla prima chiamata, non alla creazione di oggetti. In secondo luogo, anche il modo in cui il componente è configurato in COM + può fare una grande differenza; se si disabilitano tutti i servizi COM + di cui non si ha effettivamente bisogno (ad esempio transazioni), è possibile rimuovere alcune delle logiche di intercettazione che COM + posiziona attorno a tutte le chiamate di metodi. In definitiva, se non hai bisogno dei servizi forniti da COM +, non utilizzarlo.

Problemi correlati