2012-08-27 46 views
6

Tôi đang cố gắng chuyển mảng .NET sang thư viện COM VB6. Tôi có một đối tượng đó là COM wrapper của VB6 đối tượng. Nó có phương pháp với chữ ký sau đây:Vượt qua mảng C# của đối tượng COM vào VB6

[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)] 
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems); 

nhưng khi tôi gọi nó là tôi nhận được một ArgumentException với thông báo sau:

Giá trị không nằm trong phạm vi dự kiến.

Loại ngoại lệ và mô tả của nó thậm chí không phụ thuộc vào phần tử được truyền.

Có ai biết cách giải quyết vấn đề này không?

UPD: Tôi đã xóa các hội đồng bao bọc .NET và thư viện .COM nguồn tham chiếu. Không có thay đổi nào xảy ra.

+3

Các [MarshalAs] thuộc tính rõ ràng là sai. –

+0

Đồng ý. @ user1453239 tại sao bạn nghĩ rằng đó là một cấu trúc? – tcarvin

+0

Decaratioin này là từ thư viện mà tôi đang cố gắng sử dụng. Nó được cung cấp bởi nhà phát triển bên thứ ba. –

Trả lời

0

Bạn sẽ cần phải phản ánh các định dạng VB6 struct:

[StructLayout(LayoutKind.Sequential)] 
public struct myStruct { 
    type1 member1; 
    type2 member2; 
} 

Để nhập các chức năng bạn sẽ phải làm :

[DllImport("dllname.dll")] 
public static extern void AddEx(IntPtr paramName); 

Bạn có thể dễ dàng sử dụng các chức năng sau để thực hiện struct < -> Chuyển đổi IntPtr:

myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct)); 
// do stuff 
Marshal.StructureToPtr(struct, paramName, false); 

Chỉnh sửa: Tôi hiểu sai những gì bạn muốn làm. Nhưng đây là một khởi đầu cho việc làm interop.

Ngoại lệ đối số xuất phát từ việc cố gắng gửi loại tham chiếu dưới dạng loại giá trị. (Đối tượng là một lớp học, cấu trúc được xử lý khác nhau)

Nếu bạn muốn vượt qua một mảng bạn sẽ làm gì:

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param); 
0

Tôi nghĩ rằng bạn có thể viết khai báo phương thức bên ngoài như sau:

[DllImport... 
public static extern void AddEx(YourType[] paramName); 

//or like the following: 

public static extern unsafe void AddEx(YourType * paramName); 
Các vấn đề liên quan