Tôi đã tìm kiếm trên internet xa và rộng nhưng không tìm thấy giải thích tốt.Tôi có thể sử dụng SafeHandle thay vì IntPtr không?
Câu hỏi của tôi khá đơn giản.
Tôi có một DLL có chức năng được gọi là Khởi tạo và một trong các tham số là một con trỏ sẽ nhận được một xử lý được sử dụng với các cuộc gọi tiếp theo. Tham số khác là một chuỗi mà tôi sẽ liệt kê để hoàn thành. Chữ ký Tôi đang sử dụng là (theo mẫu đơn giản của nó):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
chữ ký trong DLL tự nó được viết như sau: Initialize(LPTSTR name, HANDLE handle)
với lời nhận xét "HANDLE: Con trỏ trỏ tới một vị trí đó sẽ nhận được xử lý".
Và tiếp theo các cuộc gọi đang ở trong hình thức
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
Tôi đã được đọc về SafeHandle
và tôi đã tự hỏi nếu tôi có thể sử dụng nó để substite cho xử lý IntPtr tôi. Và nếu tôi có thể, làm thế nào để tôi làm điều đó? Mở rộng lớp SafeHandle trừu tượng không phải là một vấn đề, nhưng tôi có thể trực tiếp thay thế IntPtr của tôi cho SafeHandle (và sử dụng mặc định Marshalling) hay tôi cần phải làm gì đó thêm?
lợi ích gì 'SafeHandle' cung cấp cho bạn mà chỉ lưu trữ các' IntPtr' không làm? –
@ScottChamberlain - 'SafeHandle' là' IDisposable' và đảm bảo rằng các tài nguyên được giới thiệu bởi các xử lý được phát hành.'IntPtr' chỉ đơn giản là một giá trị kích thước con trỏ có thể được truyền xung quanh - nó không có ngữ nghĩa xử lý. – LBushkin
Giả sử bạn được phép tính phí bộ nhớ, trừ khi bạn có thể de-cấp phát bộ nhớ con trỏ bằng cách sử dụng 'Marshal.FreeBSTR',' Marshal.FreeCoTaskMem', hoặc 'Marshal.FreeHGlobal', tôi không nghĩ rằng bạn có thể an toàn - phân bổ bộ nhớ từ C#. Sử dụng 'IntPtr', C# sẽ không tìm cách giải phóng bộ nhớ tự động. – Pooven