2009-11-09 23 views
11

Tôi muốn sắp xếp cấu trúc để sử dụng với P/Invoke, nhưng cấu trúc này chứa một trường chỉ liên quan đến mã được quản lý của tôi, vì vậy tôi không muốn nó được so sánh vì nó không thuộc về cấu trúc bản địa. Thậm chí có thể không? Tôi đang tìm kiếm một thuộc tính tương tự như NonSerialized cho serialization, nhưng nó dường như không tồn tại ...Làm thế nào tôi có thể bỏ qua một trường khi marshalling một cấu trúc với P/Invoke

struct MyStructure 
{ 
    int foo; 
    int bar; 

    [NotMarshaled] // This attribute doesn't exist, but that's the kind of thing I'm looking for... 
    int ignored; 
} 

Bất kỳ đề nghị sẽ được đánh giá

Trả lời

6

Không có cách nào để làm cho CLR bỏ qua một lĩnh vực. Thay vào đó tôi sẽ sử dụng hai cấu trúc, và có lẽ làm cho một thành viên của nhau.

struct MyNativeStructure 
{ 
    public int foo; 
    public int bar; 
} 

struct MyStructure 
{ 
    public MyNativeStruct native; 
    public int ignored; 
} 
+0

"Không có cách nào để làm cho CLR bỏ qua một lĩnh vực": yes, có lẽ bạn đang đúng ... Tôi sẽ chờ một vài ngày trong trường hợp ai đó có khác ý tưởng, nhưng đó có lẽ là câu trả lời hay nhất tôi sẽ nhận được. Cảm ơn ! –

1

Hai phương pháp:

  1. Sử dụng một lớp thay vì một cấu trúc: cấu trúc luôn đi ngang qua con trỏ đến các API của Windows hoặc các chức năng có nguồn gốc khác. Thay thế cuộc gọi đến doThis(ref myStruct) bằng cuộc gọi đến doThis([In, Out] myClass) sẽ thực hiện thủ thuật. Một khi bạn đã làm điều này, bạn chỉ có thể truy cập các trường không được sắp xếp của bạn bằng các phương thức.

  2. Như tôi đã nói, cấu trúc (hầu như) luôn được chuyển qua tham chiếu: do đó callee không biết gì về kích thước cấu trúc: điều gì đơn giản là để các trường bổ sung của bạn là trường cuối cùng? Khi gọi một hàm bản địa cần con trỏ của cấu trúc của bạn và kích thước của cấu trúc, chỉ đơn giản là nói dối về kích thước của nó, tạo ra một cái mà nó sẽ có mà không có các trường thừa của bạn. Tôi không biết nếu đó là một cách hợp pháp để sắp xếp lại một cấu trúc như vậy trở lại khi có được nó từ một chức năng bản địa. Câu hỏi phụ: liệu các trường lớp xử lý Marshaller có được đánh dấu là riêng tư không? (Tôi hy vọng không ...)

+2

Trường tư nhân cũng được so sánh –

Các vấn đề liên quan