2010-03-30 32 views
7

我正在使用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毫秒

小号

+0

,如果你给你的VB6和C#代码的一些细节可能有帮助。 VB6组件是一个out-of-proc服务器还是inproc?什么是对象的实际TLB片段和您正在访问的属性。呼叫是通过IDispatch还是常规的COM接口?您是使用标准的OLE编组器还是自定义代理/存根或甚至是自定义编组器? – 2010-03-30 06:15:20

+0

所以我设法通过不注入一个COM对象到COM调用(通过参数),而是在COM的一边做所有事情,从而缩短了1秒的时间。但7秒仍然似乎过度转移13000个字符! – 2010-03-30 09:19:10

+1

还有其他事情正在发生。对BSTR进行收集需要几微秒,而不是几秒钟。您应该调试VB6代码,将C#exe设置为启动程序。 – 2010-03-30 13:00:24

回答

2

几件事情: -

  1. 我VB6是有点生疏,但你的IDL摘录表明GetString方法实际上返回实现IXML接口的对象。我有点惊讶Marshal.PtrToStringAuto可以做任何有用的事情。你可以改变VB6,以便它实际返回String类型的东西吗?

  2. COM +的影响潜力巨大。首先,我会建议你比较第一次调用和后续调用的时间。首次调用COM6时,COM +需要为VB6组件启动一个主机进程,因此第一次调用总是更加痛苦。注意这发生在第一次调用时,而不是对象实例化。其次,你的组件在COM +中的配置方式也可以有很大的不同,如果您禁用了实际上不需要的所有COM +服务(例如事务),则可能可以删除COM +放置在所有方法调用周围的一些拦截逻辑。最终,如果您不需要COM +提供的服务,请不要使用它。

相关问题