2012-03-05 68 views
5

Sự khác biệt giữa tập quán DllImport ở đây là gì? Cụ thể, không "user32" chỉ có nghĩa là "user32.dll", hoặc có nghĩa là "user32.lib" hay cái gì khác?DllImport user32 vs user32.dll

[DllImport("user32")] 
protected static extern int GetKeyboardState(byte[] pbKeyState); 

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
protected static extern short GetKeyState(int vKey); 

Bạn có thể bỏ qua CharSet và CallingConvention.

Nếu chúng giống nhau, tôi có thể viết lại điều này để phù hợp hơn, nhưng nếu không, tôi không muốn có một loạt vấn đề với nó.

+0

[Đây là trang MSDN trên hàm tạo] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx) để tham chiếu. – Guvante

+0

Tài liệu liên quan là dành cho [LoadLibrary] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175 (v = vs.85) .aspx). * Nếu chuỗi chỉ định tên mô-đun không có đường dẫn và phần mở rộng tên tệp bị bỏ qua, hàm sẽ thêm phần mở rộng thư viện mặc định .dll vào tên mô-đun. Để ngăn chức năng gắn thêm .dll vào tên mô-đun, hãy bao gồm ký tự dấu chấm (.) Trong chuỗi tên mô-đun. * –

Trả lời

11

Trong ví dụ này, không có sự khác biệt. Phần mở rộng .dll sẽ tự động được thêm vào "user32" để tạo "user32.dll". Tuy nhiên, đây không phải là luôn luôn như vậy. Nếu tên tệp thư viện chứa một khoảng thời gian, phần mở rộng .dll sẽ không được tự động nối thêm.

Một số ví dụ:

[DllImport("user32")] -> Giải quyết "User32.dll". Chính xác.

[DllImport("user32.dll")] -> Giải quyết "User32.dll". Chính xác.

[DllImport("mylib.version5")] -> Giải quyết "mylib.version5". Không chính xác

[DllImport("mylib.version5.dll")] -> Giải quyết "mylib.version5.dll". Chính xác.

+0

Dường như trong quá trình thực hiện Mono của .NET, các khoảng thời gian trong tên thư viện không ngăn tự động gắn thêm tiện ích mở rộng. (Ít nhất là trong phiên bản Mono được sử dụng trong Unity 4.5.1, mà tôi tin là một biến thể của Mono 3.0.) – yoyo

+0

+1 cho "khoảng thời gian trong tên tệp thư viện", đã gãi đầu trong nhiều giờ về cái đó (cái nào là khá rõ ràng bây giờ). – helmesjo

1

Trên Windows không có sự khác biệt, việc nhập sẽ được thực hiện thành công nếu bạn bỏ qua phần mở rộng. Thông thường bỏ qua phần mở rộng là mong muốn khi chạy Mono với phần cấu hình <dllmap>, trong đó thời gian chạy P/Invoke sẽ tìm kiếm các bí danh.

Các vấn đề liên quan