我正在创建一个 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 的接口,所以这里似乎一切都应该没问题)
- 推荐的定义 sug 的方法[out] 参数数组
- 也许我缺乏一些必要的阅读材料,我会很感激链接......我仍然需要在一两天内让样本工作。
提前致谢。