在 C# 中访问 VB6 字符串的最快方法
-
23-09-2019 - |
题
我正在使用 COM 互操作。我在 VB6 中进行了一次调用,它返回大约 13000 个字符的字符串。如果我在纯 VB6 中执行调用,则执行时间大约为 800 毫秒。如果我通过 c# 和 COM Interop 执行它,大约需要 8 秒。我假设延迟是由编组引起的。
如果我对编组的看法是正确的,如果有人能建议我将其导入 C# 的最快方法,我将不胜感激。例如会不会更好 a) 将其公开为字节数组 b) 在 VB6 层中提供 byref 字符串参数
我也希望有一些示例代码。我尝试过
Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0)
无济于事。
--
继弗朗西的评论之后。我只是从 C# dll 引用 VB6 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) 是我在 C# 中实例化的另一个 COM 对象,但这需要大约 80 毫秒
S
解决方案
有几件事:-
我的 VB6 有点生疏,但您的 IDL 摘录表明 GetString 方法实际上返回一个实现 IXML 接口的对象。我有点惊讶 Marshal.PtrToStringAuto 可以用它做任何有用的事情。您能否更改 VB6,使其实际上返回 String 类型的内容?
COM+ 的影响可能是巨大的。首先,我建议您比较第一次调用与后续调用的时间。第一次调用 COM+ 时,需要为 VB6 组件启动一个主机进程,因此第一次调用总是比较痛苦。请注意,这是在第一次调用时发生的,而不是在对象实例化时发生的。其次,在 COM+ 中配置组件的方式也会产生很大的影响;如果您禁用所有实际上不需要的 COM+ 服务(例如事务),您也许能够删除 COM+ 在所有方法调用周围放置的一些拦截逻辑。最后,如果您不需要 COM+ 提供的服务,就不要使用它。
其他提示
我会考虑使用存储器映射文件或命名管道。