Trên MSDN Tôi đã tìm thấy các mô tả sau đây cho hai thuộc tính:DllImport - PreserverSig và SetLastError thuộc tính
PreserveSig Đặt lĩnh vực PreserveSig true trực tiếp dịch chữ ký không được quản lý với HRESULT hoặc giá trị retval; đặt nó thành false để tự động chuyển đổi các giá trị HRESULT hoặc retval thành các ngoại lệ. Theo mặc định, trường PreserveSig là đúng.
SetLastError Cho phép người gọi sử dụng hàm Marshal.GetLastWin32Error để xác định xem có xảy ra lỗi khi thực hiện phương pháp hay không. Trong Visual Basic, mặc định là đúng (có thêm một số phí); trong C# và C++, mặc định là sai.
Câu hỏi của tôi là: Hai cách này liên quan lẫn nhau như thế nào? Giả sử tôi có PreserveSig được đặt thành 'false' - điều đó có nghĩa là tôi cần HRESULT được chuyển thành ngoại lệ - nếu hàm không được quản lý trả về số nguyên cho biết lỗi hoặc không xảy ra lỗi, cách dịch này có thể được dịch sang ngoại lệ?
Ngoài ra tại sao tôi cần phải gọi phương thức GetLastWin32Error nếu tôi bằng cách nào đó quản lý để trích xuất ngoại lệ bằng PreserveSig?
Kind coi PK
Tôi không có kinh nghiệm với các đối tượng COM vì vậy hãy để tôi hỏi thêm một câu hỏi về việc tạo chữ ký phương thức. Câu hỏi đặt ra là: khi tôi thấy hàm COM trả về HRESULT tôi có thể đánh dấu phương thức của tôi là trả về void và đặt PreserveSig = false (như bạn đã nói), hoặc đặt PreserveSig = true và đánh dấu phương thức của tôi là trả về IntPtr để kiểm tra mã trả về bằng tay? – pkolodziej
Vâng, đó là chính xác, ngoại trừ HRESULTs là UInt32s, không phải IntPtrs. –
Cảm ơn bạn - bạn đã rất hữu ích. – pkolodziej