通过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
相关产品推荐
相关产品推荐

