Question

J'utilise COM Interop. J'ai un appel en VB6 qui retourne une chaîne d'environ 13000 caractères. Si j'exécute l'appel en VB6 pur, il faut environ 800ms pour exécuter. Si je l'exécute via c # et COM Interop il faut environ 8 secondes. Je suppose que le retard est causé par marshaling.

Si je ne me trompe pas à propos de marshaling, je serais reconnaissant si quelqu'un pourrait suggérer la manière la plus rapide que je peux obtenir cela en C #. par exemple. Serait-il préférable de a) exposer en tant que tableau d'octets b) fournir une chaîne byref param dans la couche de VB6

Je vous serais reconnaissant quelques exemples de code ainsi. J'ai essayé le

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

en vain.

-

Suite à la remarque de Franci. Je référencement simplement le dll VB6 (donc en cours) d'un dll C #. Voici un extrait 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
    ]

Je devrais probablement souligner que le paramètre (p_oEventHistory) est un autre objet COM que je suis l'instanciation en C #, mais qui prend environ 80 ms

S

Était-ce utile?

La solution

A deux choses: -

  1. Mon VB6 est un peu rouillé, mais votre extrait IDL suggère la méthode GetString retourne en fait un objet qui implémente l'interface IXML. Je suis un peu surpris que Marshal.PtrToStringAuto peut faire quelque chose d'utile à cet égard. Pourriez-vous changer le VB6 pour qu'il retourne en fait quelque chose de type String?

  2. L'effet de COM + est potentiellement énorme. Tout d'abord, je vous suggère de comparer les horaires pour la première invocation par rapport invocations ultérieures. COM + devra tourner un processus hôte pour votre composant VB6 la première fois qu'il est invoqué de sorte que le premier appel est toujours plus douloureux. Notez que ce qui se passe sur le premier appel, et non sur instanciation d'objets. D'autre part, la façon dont votre composant est configuré dans COM + peut faire une grande différence aussi; si vous désactivez tous les services COM + que vous ne fait pas besoin (par exemple les transactions), vous pourriez être en mesure d'éliminer une partie de la logique d'interception que COM + endroits dans toutes les invocations de méthode. En fin de compte, si vous n'avez pas besoin des services que COM + fournit, ne l'utilisez pas.

Autres conseils

J'envisager d'utiliser fichiers mappée ou des pipes nommés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top