我正在使用COM Interop。我在VB6中调用了一个大约13000个字符的字符串。如果我在纯VB6中执行调用,则需要大约800ms才能执行。如果我通过c#和COM Interop执行它大约需要8秒。我假设延迟是由编组引起的。在C中访问VB6字符串的最快方法#
如果我对编组正确的,我会很感激,如果有人可以建议我可以进入C#这样的最快方式。例如是否会更好 a)将它暴露为字节数组 b)向VB6层提供byref字符串参数
我会欣赏一些示例代码。我试过
Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0)
无济于事。
-
继Franci的评论。我只是从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毫秒
小号
,如果你给你的VB6和C#代码的一些细节可能有帮助。 VB6组件是一个out-of-proc服务器还是inproc?什么是对象的实际TLB片段和您正在访问的属性。呼叫是通过IDispatch还是常规的COM接口?您是使用标准的OLE编组器还是自定义代理/存根或甚至是自定义编组器? – 2010-03-30 06:15:20
所以我设法通过不注入一个COM对象到COM调用(通过参数),而是在COM的一边做所有事情,从而缩短了1秒的时间。但7秒仍然似乎过度转移13000个字符! – 2010-03-30 09:19:10
还有其他事情正在发生。对BSTR进行收集需要几微秒,而不是几秒钟。您应该调试VB6代码,将C#exe设置为启动程序。 – 2010-03-30 13:00:24