2010-03-22 38 views
19

Tôi là một lập trình viên có kinh nghiệm .Net, nhưng chưa biên dịch chương trình C/C++ trong cuộc đời tôi. Bây giờ tôi có C-dll này, tiêu đề và tài liệu (bên thứ 3, không phải từ Win API), mà từ đó tôi cần phải gọi khoảng mười phương pháp.Cách dễ nhất để tạo mã P/Invoke?

Tôi đã nghĩ đến việc sử dụng Gọi trên nền tảng. Tôi thấy ba công cụ mà sẽ tạo ra mã cho tôi:

và có thể

Pinvoker dường như có cách tiếp cận hơi khác so với trợ lý Interop và Trình hướng dẫn. Swig Tôi chỉ tìm thấy khi kiểm tra câu hỏi này chưa được hỏi ở đây.

Ưu và khuyết điểm của những công cụ này là gì?

Cách tốt nhất = dễ nhất và an toàn nhất để tôi tạo mã P/Invoke là gì vì tôi không biết nhiều về C/C++?

+0

gương cho P/Invoke Interop Trợ lý trong trường hợp codeplex bị gỡ xuống: https://drive.google.com/file/d/0B_OGphRNB0qPcWU1QVFKLS1NeWs/view?usp=sharing –

Trả lời

4

Xem http://dotnetperls.com/dllimport-interop cho ví dụ tương tác và MSDN article này để biết thêm thông tin. Kinh thánh cho công cụ này là Adam Nathan'sbook.

Về cơ bản bạn sẽ cần phải xác định các hàm trong DLL bạn muốn gọi. Những thứ này cần được đánh dấu bằng extern để làm cho chúng dễ tiếp cận với thế giới bên ngoài. Bước tiếp theo, mà có thể nhận được khôn lanh là viết một DllImport cho chức năng. Điều này cần phải ánh xạ giữa các thế giới được quản lý và không được quản lý. Bạn sẽ cần phải tìm ra cách sắp xếp bất kỳ cấu trúc dữ liệu phức tạp nào từ dll C thành mã được quản lý.

Bạn nên kiểm tra xem có bất kỳ loại giao diện COM nào cho DLL không. Hãy chắc chắn rằng bạn thực sự cần phải sử dụng P/Invoke đầu tiên.

SWIG ban đầu để gói mã C/C++ để sử dụng từ các ngôn ngữ kịch bản. Nó tạo mã C# từ một mô tả giao diện (xem tutorial). Tôi sẽ không khuyên bạn nên sử dụng nó từ C# nếu P/Gọi là một lựa chọn.

+0

Không, không có giao diện COM. Cần gọi C-dll gốc. – Ope

2

nếu chữ ký của các hàm rất đơn giản thì sẽ mất 10 phút để thiết lập - nghĩa là nếu chúng lấy 2 char * và trả về một int. Nó chỉ một lần họ trở nên phức tạp mà nó được lộn xộn

Các thánh trên pinvoke là Adam Nathans - .NET and COM: The Complete Interoperability Guide

Và tôi đồng ý với poster khác - uống một lân không phải là điều đúng đắn

+0

Giao diện không đơn giản: cấu trúc đầu vào và đầu ra phức tạp. Hoặc không siêu phức tạp, nhưng 3-6 params trong mỗi cuộc gọi, một số người trong số họ cấu trúc với một số thông số. Vì vậy, tôi thực sự muốn được trợ giúp trong thế hệ. – Ope

+1

Bạn có thể đăng các chữ ký chức năng ở đây không? Bạn có thể làm xáo trộn chúng ở một mức độ nào đó. –

+0

Tôi cần kiểm tra điều đó. Nhưng chữ ký (+ các cấu trúc liên quan) là khoảng 100 dòng. Bạn đang nói rằng những công cụ thế hệ này bằng cách nào đó về cơ bản là không tốt (nếu vậy thì tại sao?). Hoặc tại sao tôi nên làm tất cả những gì plubing bằng tay line-by-line và tham số-by-tham số thay vì sử dụng những công cụ này? – Ope

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