Estoy usando COM Interop. Tengo una llamada en VB6 que devuelve una cadena de aproximadamente 13000 caracteres. Si ejecuto la llamada en VB6 puro, se requieren aproximadamente 800ms para ejecutar. Si lo ejecuto a través de C# y COM Interop tarda unos 8 segundos. Supongo que la demora es causada por el marshaling.La forma más rápida de acceder a VB6 String en C#
Si estoy en lo correcto acerca de la clasificación, le agradecería a alguien que me sugiera la manera más rápida de conseguir esto en C#. p.ej. ¿Sería mejor que a) exponerlo como una matriz de bytes b) proporcionar un parámetro de cadena byref en la capa VB6
También apreciaría un código de muestra. Probé el
Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0)
inútilmente.
-
Siguiente a partir del comentario de Franci. Simplemente estoy haciendo referencia al dll de VB6 (en proceso) de un dll de C#. He aquí un extracto de 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
]
Probablemente debería señalar que el parámetro (p_oEventHistory) es otro objeto COM que estoy crear instancias en C#, pero que dura aproximadamente 80 ms
S
Puede serle útil si proporciona algunos detalles sobre su código VB6 y C#. ¿El componente VB6 es un servidor fuera de proc o en proceso? ¿Cuál es el fragmento real de TLB para el objeto y la propiedad a la que está accediendo? ¿La llamada pasa por IDispatch o una interfaz COM regular? ¿Está utilizando un Marshaller OLE estándar o un proxy/stub personalizado o incluso un Marshaller personalizado? –
Así que he logrado reducir 1 segundo el tiempo al no inyectar un objeto COM en la llamada COM (a través del parámetro) pero hacerlo todo en el lado COM de las cosas. ¡PERO 7 segundos todavía parece excesivo para transferir 13000 caracteres! –
Hay algo más que está pasando. Alinear un BSTR lleva microsegundos, no segundos. Debería depurar el código VB6, configurar el C# exe como el programa de inicio. –