Самый быстрый способ получить доступ к строке VB6 на C#
-
23-09-2019 - |
Вопрос
Я использую COM-взаимодействие.У меня есть вызов в VB6, который возвращает строку примерно из 13000 символов.Если я выполняю вызов в чистом VB6, для выполнения требуется около 800 мс.Если я выполняю это через c # и COM-взаимодействие, это занимает около 8 секунд.Я предполагаю, что задержка вызвана маршалингом.
Если я прав насчет маршалинга, я был бы признателен, если бы кто-нибудь подсказал самый быстрый способ перенести это в C #.например ,Было бы лучше а) представить его в виде массива байтов б) предоставить параметр строки byref в слой VB6
Я также был бы признателен за несколько примеров кода.Я попробовал
Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0)
безрезультатно.
--
Исходя из комментария Франси.Я просто ссылаюсь на библиотеку dll VB6 (so in process) из библиотеки DLL C #.Вот выдержка из 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
Решение
Пара вещей:-
Мой VB6 немного заржавел, но ваш отрывок из IDL предполагает, что метод getString фактически возвращает объект, который реализует интерфейс IXML.Я немного удивлен, что Marshal.PtrToStringAuto может сделать с этим что-нибудь полезное.Не могли бы вы изменить VB6 так, чтобы он действительно возвращал что-то типа String?
Эффект COM + потенциально огромен.Во-первых, я бы предложил вам сравнить тайминги для первого вызова с последующими вызовами.COM + потребуется запустить хост-процесс для вашего компонента VB6 при первом вызове, поэтому первый вызов всегда более болезненный.Обратите внимание, что это происходит при первом вызове, а не при создании экземпляра объекта.Во-вторых, способ настройки вашего компонента в COM + тоже может иметь большое значение;если вы отключите все службы COM +, которые вам на самом деле не нужны (напримертранзакции) возможно, вам удастся удалить часть логики перехвата, которую COM + размещает вокруг всех вызовов методов.В конечном счете, если вам не нужны услуги, предоставляемые COM +, не используйте их.
Другие советы
Я бы подумал об использовании файлы, сопоставленные с памятью или именованные каналы.