0

我正在创建一个 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] 参数数组
- 也许我缺乏一些必要的阅读材料,我会很感激链接......我仍然需要在一两天内让样本工作。

提前致谢。

4

1 回答 1

0

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

ItemData[] GetMultipleItems()

在您的方法中,如果没有,您可以返回 Null 或空数组(长度 == 0)。

或返回您的数组并使用 Count 定义一个变量。

ItemData[] GetMultipleItems(out int ItemsReturned)

WinAPI 风格的声明并不是真正在 .NET API 中声明方法等的常规方法。(但我当然可能是错的)。

于 2009-08-14T02:07:53.717 回答