You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过COM Interop将VB6数组传递给C#:解决类型不匹配问题

解决VB6调用C#带ref数组参数的类型不匹配问题

步骤1:修正C#方法的封送特性

在C#的方法参数上添加MarshalAs特性,指定数组以SafeArray形式封送给COM(VB6原生支持该数组类型)。同时确保包含方法的类和QpEnrPos_COM类型都标记为ComVisible(true)。

修改后的C#代码:

using System.Runtime.InteropServices;

[ComVisible(true)]
public class YourComClass // 确保类对COM可见
{
    [ComVisible(true)]
    public void CreateMultipleNewEsnBelegung(
        [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_DISPATCH)] 
        ref QpEnrPos_COM[] Input)
    {
        List<Domain.Entities.QpEnrPos> qpEnrPos = new List<Domain.Entities.QpEnrPos>();
        foreach (var item in Input)
        {
            qpEnrPos.Add(ComConverter.ConvertQpEnrPosComToQpEnrPos(item));
        }
        Methods.CreateMultipleNewESNPos(qpEnrPos);
    }
}

// 确保QpEnrPos_COM类型对COM可见
[ComVisible(true)]
public class QpEnrPos_COM
{
    // 类成员定义
}

说明:

  • UnmanagedType.SafeArray指定数组按COM兼容的SafeArray格式封送
  • SafeArraySubType = VarEnum.VT_DISPATCH匹配VB6中用Set赋值的COM对象类型

步骤2:修正VB6的调用代码

VB6中传递ref数组参数需显式使用ByRef,且直接传递数组变量(不要加括号,加括号会被解析为传递单个元素)。

修改后的VB6代码:

Dim qpenrPos(1) As CrossCutting_Application_ESN.QpEnrPos_COM

Set qpenrPos(0) = secondimportModel
Set qpenrPos(1) = firstimportModel

' 用ByRef传递数组,无需额外括号
obj.CreateMultipleNewEsnBelegung ByRef qpenrPos

额外注意事项

  • 确保C#项目已开启COM可见:项目属性→应用程序→程序集信息→勾选"使程序集COM可见"
  • 注册生成的COM组件:可通过regasm.exe命令,或在项目属性中勾选"注册COM互操作"
  • QpEnrPos_COM类必须包含无参数构造函数,VB6才能正常实例化对象

内容的提问来源于stack exchange,提问作者NOV29

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:50:18