2010-07-12 9 views
11

Tôi đang tạo đối tượng C# có thể nhìn thấy được cho các cuộc gọi proxy tới dịch vụ web cho ứng dụng VB6. Tôi có một phương thức trả về một mảng các đối tượng.Làm cách nào để trả về một mảng/danh sách/tập hợp các đối tượng từ C# sang VB6

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

Khi tôi gọi phương pháp này qua VB6, như vậy:

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

report = proxy.DocActionReportByDateRange(startDate, reportEndDate) 

Nó thực hiện thành công (Tôi có thể thấy rằng thông qua khai thác gỗ trên dịch vụ web) nhưng không có dữ liệu được trả lại cho các đối tượng trong VB6 (LBound (báo cáo) == 0, UBound (báo cáo) == -1).

Tôi đã thử một vài cách tiếp cận khác nhau (thay đổi phương thức thành phương thức trống và chuyển bộ sưu tập thành tham số ref) nhưng không có niềm vui cho đến nay.

Tôi cần làm gì để trả về một mảng đối tượng (danh sách, bộ sưu tập, bất kỳ thứ gì) cho người tiêu dùng VB6?

+0

Bên VB có thư viện kiểu có DocActionReport nằm trong nó không? Kiểu nhận được ở phía VB (sử dụng TypeName) là gì? Bạn đã tạo một repro bằng cách sử dụng dữ liệu tương thích của riêng bạn mà không gọi this.Invoke()? –

+0

Để trả lời câu hỏi của bạn: Có, DocActionReport không tồn tại trong thư viện kiểu. kiểu trả về là "Object()" mặc dù Object Viewer liệt kê chính xác nó là "DocActionReport()". Tôi có một khách hàng NET để kiểm tra dll và xác nhận kết quả với và nó hoạt động như mong đợi. –

+0

Bạn có chắc chắn mảng không thực sự trống không? Tôi không thể tái tạo vấn đề của bạn. (Bạn thậm chí còn quan tâm đến câu hỏi này vào ngày muộn này không?) –

Trả lời

0

Khi gọi một WebService, tất cả các kết quả phải được sắp xếp theo thứ tự để đi qua HTTP.

Tôi khuyên bạn nên trả lại JSON hoặc XML để làm cho WebService tương thích hơn với các nền tảng khác.

+0

Dịch vụ web được đề cập không trả về XML, nhưng tôi không chắc chắn câu trả lời của bạn có liên quan như thế nào. –

+1

Thay vì trả về mảng/danh sách/bộ sưu tập C#, bạn có thể trả về một chuỗi có một mảng đối tượng JSON trong đó. –

+0

nó không phải là về việc vận chuyển, nhưng biến đổi. Proxy đang thực thi và nhận các giá trị, vì vậy XML và JSON không liên quan. –

1

Dưới đây là một thủ thuật dành cho bạn:

  1. Tạo giao diện chính xác cùng với một đối tượng VB6 Com
  2. nhập mà dll vào .net
  3. tài phản xạ nhìn vào giao diện interop tạo ra, điều này sẽ hopefull cho phép bạn xem loại nào bạn cần trả lại, sau đó bạn có thể chỉ nhận được đối tượng không giúp gì cả.

Trong VB6 nếu bộ nhớ của tôi trở lại đủ xa, họ đã sử dụng thứ gì đó vẫn khiến tôi bị co giật thần kinh gọi là SAFEARRAY.

Một SAFEARRAY có lẽ là những gì cần trở lại đây, đã xem bài viết này, tôi hy vọng nó sẽ giúp bạn (cùng một vấn đề của nó) ...

How to pass a SAFEARRAY from C# to COM

Sau khi đọc về SAFEARRAY của cảm giác ruột của tôi là bạn sẽ quyết định trả về một chuỗi và có các trình phân tích cú pháp toJSON và fromJSON ở mỗi bên của cuộc gọi;)

+0

Tôi sẽ phải thử –