如何从C#返回一个对象数组/列表/集合到VB6

11

我正在创建一个COM可见的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()? - Mark Bertenshaw
回答您的问题:是的,DocActionReport确实存在于类型库中。返回的类型为“Object()”,但对象查看器正确地将其列为“DocActionReport()”。我有一个.NET客户端来测试dll并确认结果,它的工作效果符合预期。 - Jonathan Bates
你确定数组确实不为空吗?我无法重现你的问题。(你在这么晚的日期还关心这个问题吗?) - Ciaran Keating
2个回答

1
以下是一些建议:
  1. 创建一个与VB6 Com对象完全相同的接口
  2. 将该dll导入到.net中
  3. 使用反射器查看生成的interop接口,这可能会让您看到需要返回什么类型,但您可能只会得到无法帮助的对象。

如果我回忆起来没错,在VB6中,他们使用了一些仍然让我有神经紧张的东西,称为SAFEARRAY。

在这里可能需要返回的是SAFEARRAY,请查看此文章,希望它能帮助您(它是相同的问题)...

如何从C#传递SAFEARRAY到COM

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


我得试一下这个。 - Jonathan Bates

0

在调用 WebService 时,所有结果必须进行序列化以通过 HTTP 传输。

我建议你返回JSONXML,以使 WebService 与其他平台更具互操作性。


所涉及的 Web 服务确实返回 XML,但我不确定你的回答与此有何关联。 - Jonathan Bates
1
你可以返回一个包含JSON对象数组的字符串,而不是返回一个C#数组/列表/集合。 - Eduardo Molteni
重点不在于传输,而在于转换。代理正在执行和接收值,因此XML和JSON都是无关紧要的。 - Jonathan Bates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接