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

标签 c# string vb6 marshalling com-interop

我正在使用 COM Interop。我在 VB6 中有一个调用,它返回一个大约 13000 个字符的字符串。如果我在纯 VB6 中执行调用,则执行大约需要 800 毫秒。如果我通过 c# 和 COM Interop 执行它,大约需要 8 秒。我假设延迟是由编码引起的。

如果我对编码(marshal)处理的看法是正确的,那么如果有人可以建议我将其放入 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 毫秒

小号

最佳答案

一些事情:-

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

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

关于c# - 在 C# 中访问 VB6 字符串的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2543139/

相关文章:

c# - 打开已经关闭的 SqlConnection

c# - VB6:二进制文件是如何编码的?使用 Put 语句

vb6 - 无权访问私有(private) MSMQ

c# - 使用 chrome 而不是 SHDocVw.InternetExplorer

c# - 阻止 VS 将属性值放入 .Designer.cs 文件

C# 版本的 OpenSSL EVP_BytesToKey 方法?

c# - 在 WPF 列表框中禁用键盘导航

java - 如何创建一个不区分大小写的 JTextField,它将忽略空格?

python - Python 中的字符串模板 : what are legal characters?

linux计数字符然后输出用户输入的字符串中的字符数,它还需要一个while循环