我创建一个COM可调用.NET程序集,现在试图从传统的COM客户端使用它(VB6客户在我的情况)之间的用户定义类型的数组。编组了VB6和.NET
大会应公开API风格的界面,所以典型的函数声明应该是这样的:
int myRoutine (object inParam, out object result);
问题是,当我试图使用函数声明为:
int GetMultipleItems (out ItemData[] itemList);
在VB6这个翻译函数有数组作为参数传递,当我用'无效的过程调用或参数'调用它时失败。
实际通话的样子:
Dim items() As ItemData
result = SCServer.GetMultipleItems (items)
进一步调查,我试图标志着我的库的MarshalAs属性的几种不同的方式。从我的角度来看,问题是参数必须被传入并且 - 另一方面 - 要返回到VB代码的变体。
经过多次实验,我得到了以下的工作(1):
int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_DISPATCH)]out object[] itemList);
(有项目()声明为在客户端对象)。
但我不得不使用正是我最初的签名(2),
int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_DISPATCH)]out ItemData[] itemList);
这并不与任何对象,或在客户端的ItemData数组类型的申报工作。
所以,问题是:
- 为什么(1)工作,而(2)没有。我应该在属性声明或客户改变什么让我在签名实际类型的工作(它暴露已出口到TLB以及一个接口,所以似乎都应该在这里OK)
- 什么是推荐的方法定义sugh [OUT]参数数组
- 也许我缺少一些基本的阅读,我将是...我仍然需要得到样品中一两天工作的联系表示感谢。
在此先感谢。
我正在考虑将此作为选项。没有提到的问题 - 返回值不是真正的项目计数,它包含操作错误。如果没有其他办法,你的建议仍然可能有用 – 2009-08-14 08:11:50