Самый быстрый способ получить доступ к Строке VB6 в C#

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

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

Я ценил бы некоторый пример кода также. Я попробовал

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

напрасно.

--

Следование за комментарием Franci. Я просто ссылаюсь на 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

7
задан skaffman 30 March 2010 в 07:15
поделиться

2 ответа

Пара вещей: -

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

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

2
ответ дан 7 December 2019 в 18:41
поделиться

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

0
ответ дан 7 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: