2010-07-12 66 views
11

我正在创建一个COM Visible C#对象来代理对用于VB6应用程序的webservice的调用。我有一个方法返回一个对象数组。如何返回从C#到VB6的对象的数组/列表/集合

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(报告)== 0,UBound(报告)== -1)。

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

我需要做什么才能将一组对象(列表,集合,其他)返回给VB6使用者?

+0

VB端是否有一个包含DocActionReport的类型库?什么是VB端收到的类型(使用TypeName)?您是否使用自己的兼容数据创建了repro而不调用this.Invoke()? – 2010-07-13 11:51:36

+0

要回答您的问题:是的,DocActionReport确实存在于类型库中。尽管对象查看器正确地将它列为“DocActionReport()”,但返回的类型是“Object()”。我有一个.NET客户端来测试DLL并确认结果,并按预期工作。 – 2010-07-13 16:15:41

+0

你确定数组不是真的空吗?我无法重现您的问题。 (你还在这个迟到的日子是否还在意这个问题?) – 2010-12-05 01:28:49

回答

0

当调用一个WebService时,所有结果必须通过序列化才能通过HTTP传输。

我建议你回到JSONXML使web服务与其他平台的互操作性更强。

+0

有问题的Web服务确实返回XML,但我不确定你的答案是如何相关的。 – 2010-10-20 10:43:02

+1

而不是返回一个C#数组/列表/集合,您可以返回一个字符串,其中有一个JSON数组对象。 – 2010-10-20 11:20:51

+0

它不是关于运输,而是改造。代理正在执行和接收值,所以XML和JSON是无关紧要的。 – 2010-10-21 11:25:03

1

下面是你一招:

  1. 创建一个VB6 COM对象完全相同的接口
  2. 导入该DLL到.NET
  3. 用户反射器查看生成的互操作界面,这将hopefull允许你看到你需要返回什么类型,然后再次,你可能会得到的对象,根本没有任何帮助。

在VB6中,如果我的记忆力恢复得足够的话,他们用了一些仍然让我感到紧张的叫做SAFEARRAY的抽搐。

一个SAFEARRAY可能就是需要返回这里,看看这篇文章,我希望它可以帮助你(它同样的问题)......

How to pass a SAFEARRAY from C# to COM

阅读SAFEARRAY的我的直觉之后你会决定返回一个字符串,并在通话的每一边都必须有JSON和来自JSON解析器;)

+0

我将不得不试一试 – 2010-12-27 18:10:32

相关问题