在VB6和.net之间编组用户定义类型的数组

时间:2009-08-13 13:51:04

标签: .net vb6 marshalling

我正在创建一个COM可调用的.net程序集,现在尝试从旧的COM客户端(在我的情况下是VB6客户端)中使用它。

程序集应公开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);  

(在客户端将items()声明为Object)。

但我必须使用我的初始签名(2),

int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
    SafeArraySubType = VarEnum.VT_DISPATCH)]out ItemData[] itemList); 

使用Object或在客户端使用ItemData数组类型声明不起作用。

所以,问题是:
  - 为什么(1)工作,而(2)不工作。我应该在属性声明或客户端中更改什么才能在签名中使用我的实际类型(它公开了一个已经导出到tlb的接口,所以看起来一切都应该没问题了)
  - 定义sugh [out]参数数组的推荐方法是什么   - 也许我缺少一些必要的阅读,我会很感激这些链接...我仍然需要在一两天内让样本工作。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您是否可以更改声明,以便返回对象数组,客户端可以从返回的内容中检索它们的数量。

ItemData[] GetMultipleItems()
在你的方法中,如果没有,你可以返回Null或Empty数组(长度== 0)。

或者返回数组并使用Count定义变量。

ItemData[] GetMultipleItems(out int ItemsReturned)

WinAPI样式声明并不是在.NET API中声明方法等的常用方法。 (但我当然可能是错的)。