【问题标题】:How do I return an array/list/collection of objects from C# to VB6如何将对象的数组/列表/集合从 C# 返回到 VB6
【发布时间】:2011-03-14 16:08:15
【问题描述】:

我正在创建一个 COM Visible C# 对象来代理对 VB6 应用程序的 Web 服务的调用。我有一个返回对象数组的方法。

public DocActionReport[] DocActionReportByDateRange(System.DateTime reportStartDate, System.DateTime reportEndDate)
{
    object[] results = this.Invoke("DocActionReportByDateRange", new object[] {
                reportStartDate,
                reportEndDate});
    return ((DocActionReport[])(results[0]));
}

当我通过 VB6 调用这个方法时,像这样:

Dim proxy As New QueueMovementServiceClient.ReadQueueInfo
Dim report() As QueueMovementServiceClient.DocActionReport

report = proxy.DocActionReportByDateRange(startDate, reportEndDate)

它成功执行(我可以通过登录 Web 服务看到)但没有数据返回到 VB6 中的对象 (LBound(report) == 0, UBound(report) == -1)。

我尝试了几种不同的方法(将方法更改为 void 方法并将集合作为 ref 参数传入),但到目前为止没有任何乐趣。

我需要做什么才能将对象数组(列表、集合等)返回给 VB6 使用者?

【问题讨论】:

  • VB 端是否有包含DocActionReport 的类型库? VB 端接收到的类型是什么(使用 TypeName)?您是否在不调用 this.Invoke() 的情况下使用自己的兼容数据创建了重现?
  • 回答您的问题:是的,DocActionReport 确实存在于类型库中。返回的类型是“Object()”,尽管 Object Viewer 正确地将其列为“DocActionReport()”。我有一个 .NET 客户端来测试 dll 并确认结果,它按预期工作。
  • 你确定数组确实不是空的吗?我无法重现您的问题。 (这么晚了你还关心这个问题吗?)

标签: arrays vb6 com-interop


【解决方案1】:

这里有一个技巧:

  1. 使用 VB6 Com 对象创建完全相同的界面
  2. 将该 dll 导入 .net
  3. 用户反射器来查看生成的互操作接口,这将有希望让您看到需要返回的类型,然后您可能会再次获得完全没有帮助的对象。

在 VB6 中,如果我的记忆可以追溯到足够远,他们使用的东西仍然让我感到紧张,称为 SAFEARRAY's。

A SAFEARRAY 可能需要在这里返回,看看这篇文章,希望它对你有帮助(同样的问题)......

How to pass a SAFEARRAY from C# to COM

在阅读了关于 SAFEARRAY 的内容后,我的直觉是,您将决定返回一个字符串,并且在调用的每一端都有 toJSON 和 fromJSON 解析器;)

【讨论】:

  • 我得试试这个
【解决方案2】:

调用 WebService 时,所有结果都必须经过序列化才能通过 HTTP。

我建议您返回 JSONXML 以使 WebService 与其他平台的互操作性更强。

【讨论】:

  • 有问题的 Web 服务确实返回 XML,但我不确定您的答案是否相关。
  • 您可以返回一个包含 JSON 对象数组的字符串,而不是返回 C# 数组/列表/集合。
  • 这不是关于传输,而是关于转换。代理正在执行和接收值,因此 XML 和 JSON 无关紧要。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2020-01-05
  • 2020-04-22
  • 2021-01-30
  • 1970-01-01
相关资源
最近更新 更多