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
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? –
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! –
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. –