Tôi đã hàm sau trong C++ DLLC# DllImport với C++ boolean chức năng không trở lại một cách chính xác
extern "C" __declspec(dllexport) bool Exist(const char* name)
{
//if (g_Queues.find(name) != g_Queues.end())
// return true;
//else
// return false;
return false;
}
Bên trong C# lớp tôi có như sau:
[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]
public static extern bool Exist(string name);
Tuy nhiên, bất cứ khi nào tôi gọi tôi chức năng nó luôn luôn trả về đúng, ngay cả khi tôi nhận xét ra chức năng nhỏ của tôi và làm cho nó trở lại sai. Tôi có cảm giác có cái gì đó sai với quy ước gọi điện thoại của tôi hoặc bất kỳ vấn đề khác với P/Gọi DLL của tôi, có thể tương ứng với chuỗi và const char *, nhưng bây giờ tôi hoàn toàn không biết gì. Tôi đang làm gì sai? Tại sao nó trả về true thay vì sai?
EDIT: tôi đã tìm ra này không có gì để làm với các char * const hoặc chuỗi, vì vấn đề vẫn còn có một chức năng có sản phẩm nào. Tôi đã thử thay đổi quy ước gọi giữa Cdecl và StdCall và không hoạt động chính xác. Tôi cũng đã quản lý để gỡ lỗi DLL của tôi và nó được gọi là chính xác và thực sự trở về sai, nhưng một khi trở lại vào C# nó bằng cách nào đó là đúng sự thật. Thay đổi CharSet cũng không có hiệu lực. Tôi đã chắc chắn rằng tôi đã cung cấp chương trình C# của tôi với phiên bản mới nhất và chính xác của DLL của tôi mỗi lần, do đó, đó không phải là một vấn đề là tốt. Một lần nữa, tôi hoàn toàn không biết gì về lý do tại sao kết quả là đúng khi tôi thực sự trở về sai.
EDIT2: SOReader đã cung cấp cho tôi đề xuất khắc phục sự cố quan trọng khác, xem nhận xét của tôi. Đáng buồn thay, nó không khắc phục được vấn đề trả về.
EDIT3: tôi đã kết luận rằng việc thay đổi kiểu trả về của Exist (bool) vào (int) đột nhiên làm cho nó trả lại số đúng (true = 1, false = 0). Điều đó có nghĩa là có thể có một vấn đề giữa bool của C++ và bool của C#. Tôi có thể tiếp tục sử dụng một int như một bool, nhưng điều đó vẫn sẽ không giải thích được vấn đề ban đầu. Có lẽ ai đó khác có thể khai sáng cho tôi về điều này? Có lẽ nó đã làm với thực tế là tôi đang sử dụng x64 (mặc dù cả hai pojects được biên dịch như x86)
Điều đầu tiên cần kiểm tra là chức năng thực tế là 'cdecl'. Nếu makefile của bạn chuyển 'Gz' hoặc' Gr' vào trình biên dịch, thì hàm ở trên không phải là 'cdecl'. Thêm một '__cdecl' vào mã C của bạn, hoặc kích hoạt Trợ lý gỡ lỗi được quản lý' pInvokeStackImbalance'. –
Tôi không nghĩ rằng nó sẽ liên kết nếu/Gr hoặc/Gz được chỉ định. Điểm tốt về Trợ lý gỡ lỗi được quản lý. –
Tôi đã thử nghiệm nó và __fastcall sẽ không liên kết với/clr. Nhưng các liên kết __stdcall (/ Gz) nhưng sau đó không tìm thấy điểm nhập Exist trong thời gian chạy vì chữ ký hàm là khác nhau. –