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

C# 在C中访问VB6字符串的最快方法#,c#,string,vb6,marshalling,com-interop,C#,String,Vb6,Marshalling,Com Interop,我正在使用COM互操作。我在VB6中有一个调用,它返回大约13000个字符的字符串。如果我在纯VB6中执行调用,执行大约需要800毫秒。如果我通过c#和COM互操作执行它,大约需要8秒。我想延迟是由编组造成的 如果我对编组的看法是正确的,如果有人能建议我以最快的方式进入C#,我将不胜感激。e、 g.这样会更好吗 a) 将其公开为字节数组 b) 在VB6层中提供byref字符串参数 我也希望有一些示例代码。我试过了 Marshal.PtrToStringAuto(Marshal.ReadIntPt

我正在使用COM互操作。我在VB6中有一个调用,它返回大约13000个字符的字符串。如果我在纯VB6中执行调用,执行大约需要800毫秒。如果我通过c#和COM互操作执行它,大约需要8秒。我想延迟是由编组造成的

如果我对编组的看法是正确的,如果有人能建议我以最快的方式进入C#,我将不胜感激。e、 g.这样会更好吗 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/P>< P>我会考虑使用或命名管道。

两件事:-< /P>

  • 我的VB6有点生疏,但您的IDL摘录表明GetString方法实际上返回了一个实现IXML接口的对象。我有点惊讶Marshal.PtrToStringAuto能用这个做任何有用的事情。能否更改VB6,使其实际返回字符串类型的内容

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


  • 如果您提供一些有关VB6和C代码的详细信息,可能会有所帮助。VB6组件是进程外服务器还是进程内服务器?对象和您正在访问的属性的实际TLB片段是什么。调用是通过IDispatch还是常规COM接口进行的?您使用的是标准OLE封送拆收器还是自定义代理/存根,甚至是自定义封送拆收器?因此,我通过不向COM调用中注入COM对象(通过参数),而是在COM端执行所有操作,节省了1秒的时间。但是7秒对于传输13000个字符来说似乎还是太多了!还有别的事。封送BSTR需要微秒,而不是秒。您应该调试VB6代码,将C#exe设置为启动程序。因此,我这样做了,在调用VB6函数时以及在C#代码的返回点设置断点。延迟发生在它离开VB6并返回C#之前。我忽略提到的另一个因素是VB6DLL驻留在COM+中,因此我想知道问题是否存在于附近的某个地方。但我不太确定如何开始诊断。对于建议,这里有一个猜测:COM+可能使您的一些对象托管在不同的进程中,这使得封送处理速度变慢。