Самый быстрый способ получить доступ к VB6 String в C # - PullRequest
7 голосов
/ 30 марта 2010

Я использую COM Interop. У меня есть вызов в VB6, который возвращает строку примерно 13000 символов. Если я выполняю вызов в чистом VB6, это займет около 800 мсек. Если я выполню это через c # и COM Interop, это займет около 8 секунд. Я предполагаю, что задержка вызвана маршалингом.

Если я прав насчет маршалинга, я был бы благодарен, если бы кто-нибудь мог предложить самый быстрый способ, которым я могу получить это в C #. например Будет ли лучше а) выставить его как байтовый массив b) предоставить параметр строки byref в слой VB6

Буду признателен также за пример кода. Я попробовал

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

безрезультатно.

-

Исходя из комментария Франси. Я просто ссылаюсь на VB6 DLL (так в процессе) из C # DLL. Вот выдержка из 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
    ]

Я, вероятно, должен указать, что параметр (p_oEventHistory) - это еще один COM-объект, который я создаю в C #, но это занимает около 80 мс

S

Ответы [ 2 ]

2 голосов
/ 08 апреля 2010

Несколько вещей: -

  1. Мой VB6 немного заржавел, но ваш отрывок IDL предполагает, что метод GetString фактически возвращает объект, который реализует интерфейс IXML.Я немного удивлен, что Marshal.PtrToStringAuto может сделать что-нибудь полезное с этим.Не могли бы вы изменить VB6 так, чтобы он действительно возвращал что-то типа String?

  2. Эффект COM + потенциально огромен.Во-первых, я хотел бы предложить вам сравнить время первого вызова с последующими вызовами.При первом вызове COM + потребуется ускорить хост-процесс для вашего компонента VB6, поэтому первый вызов всегда будет более болезненным.Обратите внимание, что это происходит при первом вызове, а не при создании объекта.Во-вторых, способ, которым ваш компонент настроен в COM +, также может иметь большое значение;если вы отключите все службы COM +, которые вам на самом деле не нужны (например, транзакции), вы сможете удалить часть логики перехвата, которую COM + размещает вокруг всех вызовов методов.В конечном счете, если вам не нужны услуги, предоставляемые COM +, не используйте их.

0 голосов
/ 04 апреля 2010

Я хотел бы рассмотреть возможность использования сопоставленных файлов памяти или именованных каналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...