在C#中访问VB6字符串的最快方法

时间:2010-03-30 06:04:38

标签: c# string vb6 marshalling com-interop

我正在使用COM Interop。我在VB6中调用了一个大约13000个字符串的字符串。如果我在纯VB6中执行调用,则执行大约需要800ms。如果我通过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对象,但需要大约80ms

取值

2 个答案:

答案 0 :(得分:2)

有几件事: -

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

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

答案 1 :(得分:0)

我会考虑使用memory mapped files或命名管道。