2010-03-25 32 views
15

Có cách nào để tự động tạo p/gọi trình bao bọc cho .net từ tiêu đề c không?Tự động tạo trình bao bọc C# từ tiêu đề c?

Tất nhiên tôi có thể tạo chúng bằng tay, nhưng việc duy trì chúng sẽ rất đau đớn và có thể tôi sẽ phạm sai lầm ở đâu đó sẽ gây khó khăn cho việc gỡ lỗi.

Tôi đã thử SWIG, nhưng nó đã tạo ra các lớp đầy đủ, nơi các cấu trúc đơn giản sẽ là đủ. Một vấn đề khác với SWIG là nó yêu cầu mã interop bổ sung ở phía c.

Tôi thích nếu đầu ra hoạt động trên mono quá, nhưng điều đó là không cần thiết.

Một thứ khác mà tôi có thể làm là chương trình phân tích tiêu đề c và tạo đầu ra ở định dạng trung gian đẹp như xml, từ đó tôi có thể tự tạo C# wrapper.

Chỉnh sửa:
Trợ giúp tương tác PInvoke là những gì tôi cần.
Có một số vấn đề nhỏ với nó:
* Nó dịch "unsigned char *" thành chuỗi nơi tôi muốn IntPtr
* Giả định rằng size_t = int = long = 32bit. Điều này hiện đúng với tôi, nhưng có thể không đúng trên mọi nền tảng.
Có cách nào hiệu quả để khắc phục điều đó không? Khác tôi sẽ sử dụng một chút tìm và thay thế trên mã c trước khi chuyển đổi nó.

Trả lời

10

PInvoke Interop Assistant phải phù hợp hơn với bạn, nó được thiết kế đặc biệt để hoạt động với mã C.

Hãy cẩn thận rằng không có công cụ nào mang lại cho bạn giải pháp đảm bảo 100%, các khai báo C là cách quá mơ hồ để đảm bảo kết quả hoàn toàn không gặp sự cố. Sự cố gây ra bởi con trỏ, phổ biến trong mã C. Không có cách nào để nói rằng một con trỏ được sử dụng để đọc hoặc ghi bộ nhớ. Hoặc cả hai. Hoặc ai chịu trách nhiệm giải phóng bộ nhớ đang được chỉ ra.

Đây cũng là một lỗi chính cho các máy phân tích mã tĩnh, họ không thể thực hiện một công việc phù hợp nếu họ không biết cách sử dụng con trỏ. Họ chỉ có thể phỏng đoán nó từ việc sử dụng, nhưng đó là một vấn đề về gà và trứng, việc sử dụng có thể sai. Microsoft đã giải quyết vấn đề trong các tiêu đề của riêng họ với SAL annotations, đánh dấu bổ sung trung lập cho trình biên dịch nhưng có thể được phân tích bằng trình phân tích mã. Họ nói rõ ràng mục đích sử dụng một con trỏ.

Cũng được sử dụng bởi Trợ lý tương tác Pinvoke, đó là lý do tại sao nó có thể thực hiện công việc tốt hơn trên các khai báo winapi. Nhưng điều đó tất nhiên chỉ hoạt động trên các tiêu đề của Microsoft, những chú thích SAL này thường bị thiếu trên mã được viết bởi một lập trình viên bận rộn của C.

+1

Tôi đồng ý với Trợ lý tương tác. Hãy nhận biết rằng GUI có một lỗi gây phiền nhiễu (giới hạn độ dài, phiền phức nếu bạn muốn dịch nhiều tập tin tiêu đề) và mã C# được tạo ra cho bitfields không chỉ thực sự xấu, mà còn sai (tức là bạn * phải * xác minh mã trường bit bằng tay). Đối với bất cứ điều gì ngoại trừ các lĩnh vực bit, tôi thấy nó hoạt động tốt, mặc dù điều đầu tiên tôi làm với mã là loại bỏ các không gian tên dài ('System.Runtime.InteropServices' cho mỗi thuộc tính). – OregonGhost

+1

Có một số vấn đề nhỏ với nó. Nó dịch "unsigned char *" thành chuỗi nơi tôi muốn IntPtr, và giả định rằng int = long = 32bit. Có cách nào sạch sẽ để khắc phục điều đó không? Khác tôi sẽ sử dụng một chút tìm và thay thế trên mã c trước khi chuyển đổi nó. – Winner

+1

Đó là những sự mơ hồ mà tôi đã cảnh báo bạn. Không có cách nào sạch sẽ, việc phải khai báo P/Invoke được tạo ra là bình thường. Btw: int và long là 32 bit trong hầu hết mã C/C++. –

1

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn về cơ bản hỏi xem có cách nào để làm những gì SWIG làm không.

Tất nhiên, bạn muốn làm điều này một chút khác nhau, do đó, một tùy chọn sẽ là lấy mã SWIG và thay đổi nó để hoạt động theo cách bạn muốn.

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