Tôi đã xây dựng một dll C++ mà tôi muốn gọi từ mã C#. Tôi có thể gọi một chức năng, nhưng khác ném một ngoại lệ khi mã C# cố gắng để tải các dll.Chức năng xuất từ C++ dll sang C# P/Invoke
Phần header trông như thế này: (? Gì foo = foo có nghĩa là trong lĩnh vực tên)
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
này tạo ra một dll với bảng xuất khẩu hơi khó hiểu:
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
P My/Khai báo các tuyên bố như sau:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
Cuộc gọi cài đặt trả về không ngoại lệ, nhưng khi tôi gọi PPPConnec t, tôi nhận được một MissingMethodException - "Không thể tìm thấy một Entry Point 'PPPConnect' trong một PInvoke DLL 'PPPManager.dll'."
Tôi đã thử xóa chỉ thị extern và declspec khỏi khai báo hàm Install, do đó PPPConnect là hàm duy nhất được xuất và điều này vẫn không cho phép tôi gọi PPPConnect.
Tôi cũng đã thử thực hiện DllImport theo thứ tự; điều này cho kết quả tương tự như gọi bằng tên - Cài đặt trả về, nhưng PPPConnect ném ngoại lệ "Không thể tìm thấy một Entry Point '# 2' ...".
Nhật ký interop cho:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
Đây là cũng ngoài khu vực chuyên môn của tôi, vì vậy bất cứ đề nghị hoặc những suy nghĩ sẽ được hoan nghênh.
Cảm ơn, Paul
chỉnh sửa: Nó chỉ ra rằng mã này làm việc; vấn đề là với dll mới nhất không được tuyên truyền cho thiết bị. D'oh!
Tôi chưa bao giờ nghe nói về log interop này - làm thế nào để cho phép/xem đó? – Charlie
http://blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx Tôi chỉ mới bắt đầu sử dụng nó để thử và gỡ lỗi vấn đề này, nhưng có vẻ như nó đã giúp tôi tiết kiệm rất nhiều thời gian gỡ lỗi MissingMethodExceptions. – Symmetric