Pregunta

Estoy utilizando la interoperabilidad COM. Tengo una llamada en VB6 que devuelve una cadena de aproximadamente 13.000 caracteres. Si ejecuto la llamada en VB6 pura se tarda alrededor de 800 ms a ejecutar. Si ejecuto a través de C # y la interoperabilidad COM se tarda aproximadamente 8 segundos. Estoy asumiendo que el retraso es causado por el cálculo de referencias.

Si estoy en lo correcto sobre el cálculo de referencias, estaría agradecido si alguien podría sugerir la forma más rápida que puedo conseguir esto en C #. p.ej. ¿Sería mejor a) exponer como una matriz de bytes b) proporcionar un byref PARAM cadena en la capa de VB6

Le agradecería algunos ejemplos de código también. Probé la

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

en vano.

-

A raíz de comentario de Franci. Simplemente estoy haciendo referencia a la DLL de VB6 (así 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 se debe 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

¿Fue útil?

Solución

Un par de cosas: -

  1. Mi VB6 es un poco oxidado, pero su extracto IDL sugiere el método GetString realidad devuelve un objeto que implementa la interfaz iXML. Estoy un poco sorprendido de que Marshal.PtrToStringAuto puede hacer nada útil con esto. ¿Podría cambiar el Visual Basic 6 para que se devuelve en realidad algo de tipo String?

  2. El efecto de COM + es potencialmente enorme. En primer lugar me gustaría sugerir que se comparan los tiempos de la primera invocación frente invocaciones posteriores. COM + tendrá que girar un proceso de host para su componente VB6 la primera vez que se invoca por lo que la primera llamada es siempre más doloroso. Tenga en cuenta que esto sucede en la primera invocación, no en instancias de objetos. En segundo lugar, la forma en que el componente está configurado en COM + puede hacer una gran diferencia también; si deshabilita todos los servicios COM + que en realidad no se necesita (por ejemplo, transacciones) que puede ser capaz de eliminar parte de la lógica de intervención, de que lugares COM + en torno a todas las llamadas a métodos. En última instancia, si no es necesario que los servicios COM + proporciona, no deberá ser utilizado.

Otros consejos

Me consideraría usar archivos mapeados o canalizaciones con nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top