Tôi có một ứng dụng C# sử dụng một DLL C++ không được quản lý. Tôi đã tìm thấy một vụ tai nạn mà chỉ xảy ra trong WinXP (không phải Win7) khi bộ nhớ tôi đang quay trở lại từ C + + DLL là quá lớn.Giới hạn bộ nhớ trong WinXP khi nhận được cuộc gọi lại từ một DLL C++ trong C# là gì?
Luồng cơ bản là C# bắt đầu một hoạt động trong DLL C++ bằng cách gọi hàm khởi động, trong đó nó cung cấp gọi lại. C++ DLL sau đó thực hiện các hoạt động và đổ thông tin đăng nhập vào một bộ đệm văn bản. Khi hoạt động được hoàn thành C++ DLL gọi callback và vượt qua bộ đệm văn bản như một tham số:
C++:
typedef void (CALLBACK *onfilecallbackfunc_t)(LPCWSTR);
DLL_API void NWAperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback);
l_pFileCallback(_wstringCapture.c_str());
C#:
public delegate void FileCallback([MarshalAs(UnmanagedType.LPWStr)] string buffer);
public static extern void SetOnFileCallback(FileCallback fileCallback);
private void OnFile(string buffer);
này hoạt động tốt trong Win7, nhưng trong WinXP nếu bộ đệm quá lớn, nó bị treo. Tôi không chắc chắn về kích thước chính xác gây ra điều này nhưng tôi đã đặt một giới hạn 8MB vào nó và vụ tai nạn đã biến mất.
Có ai biết giới hạn về số lượng bộ nhớ có thể được chuyển giữa C++ và C# như thế này trong WinXP không? Hoặc tôi đã hoàn toàn hiểu lầm vấn đề này và có một lời giải thích hợp lý hơn?
Cập nhật: Tôi cần phải cụ thể hơn - điều này xảy ra trên cùng một máy tính có khởi động kép WinXP và Win7, cả hai hệ điều hành 32 bit.
+1 cho câu hỏi thú vị. Tôi cũng muốn biết câu trả lời cho điều này. – Polynomial
Bạn nói rằng nó chỉ xảy ra trên Windows XP? Đây có phải là một hộp XP x86 như trái ngược với một Win7 x64? Nếu bạn đang xử lý kiến trúc 64 bit 32 bit, đó có thể là nguồn gốc của sự cố ... –
Mở rộng nhận xét của Steve, bạn đã cố gắng biên dịch mã C# của bạn nhắm mục tiêu x86 thay vì AnyCPU chưa? –