2010-04-15 30 views
5

Tôi có một thư viện COM bên thứ 3 mà tôi đang sử dụng và đang gặp sự cố với tham số mảng.Sử dụng tham số Array ref trong C# với COM interop

Chữ ký phương pháp mà tôi gọi là như sau:

int GetItems(ref System.Array theArray) 

Các tài liệu nói rằng giá trị trả về của phương pháp là số lượng các mục nó sẽ cư vào mảng, nhưng khi nó được được gọi là, tất cả các giá trị trong mảng chỉ là các giá trị mặc định (chúng là các cấu trúc) mặc dù phương thức trả về một giá trị trả về khác không.

Tôi biết có một số công cụ tương tác COM thú vị đang diễn ra ở đây, nhưng tôi thực sự không có nhiều kinh nghiệm với nó và không thể tìm ra. Đây là cách tôi đã cố truy cập:

Array items = Array.CreateInstance(typeof(structItem), 100); 
int numberOfItems = instance.GetItems(items); 

Array items = Array.CreateInstance(typeof(structItem), 100); 
int numberOfItems = instance.GetItems(ref items); 

structItem[] items = new structItem[100]; 
int numberOfItems = instance.GetItems(items); 

structItem[] items = new structItem[100]; 
int numberOfItems = instance.GetItems(ref items); 

Tôi đang làm gì sai?

CẬP NHẬT: Tôi nghĩ rằng nó có thể có liên quan đến SafeArrays, như được mô tả ở đây: http://www.west-wind.com/Weblog/posts/464427.aspx Sự khác biệt là tôi phải chuyển vào mảng bằng ref, không chỉ xử lý giá trị trả về. Các giải pháp cụ thể từ bài viết này không hoạt động, nhưng tôi cảm thấy như tôi đang nhận được ấm hơn.

Trả lời

0

Đã lâu rồi kể từ khi tôi thực hiện bất kỳ Interop nào nên tôi không chắc chắn, nhưng tôi nghĩ bạn nên phân bổ bộ nhớ không được quản lý để gửi đến thư viện COM. Tôi muốn nhìn vào lớp Marshal, đặc biệt là Marshal.AllocHGlobal (bạn có thể phải sử dụng FreeHGlobal để giải phóng bộ nhớ ở phía sau).

Cái gì đó như có lẽ đây:

IntPtr p = Marshal.AlloHGlobal(items.Length * Marshal.SizeOf(typeof(structItem)); 
Marshal.Copy(items, 0, p, items.Length); 
Các vấn đề liên quan