Tất cả mọi người sử dụng P/Invoke của Windows API biết một danh sách dài các tờ khai của các chức năng tĩnh với các thuộc tính nhưTại sao Microsoft không cung cấp cho C# một lớp Win32 tĩnh với các hàm và cấu trúc nguyên bản nhất bên trong như windows.h?
Việc kê khai các công trình sao chép từ tiêu đề Windows như WinNT.h hoặc từ các trang web như www.pinvoke .net cũng mất rất nhiều vị trí trong các chương trình của chúng tôi.
Tại sao tất cả chúng ta phải dành thời gian cho việc này? Tại sao Microsoft không cung cấp cho chúng ta một cách đơn giản để bao gồm một dòng như trong các chương trình không được quản lý cũ
#include <windows.h>
và chúng tôi sẽ có quyền truy cập vào một lớp tĩnh Native
với tất cả hoặc các chức năng của Windows nhất và cấu trúc bên trong?
CẬP NHẬT dựa trên số câu trả lời:
Nó bạn sẽ thành thật với chính mình, đó là một phần của chương trình .NET của bạn đang chạy không dưới Windows? 5%? 1%? Nếu bạn sử dụng WMI, Process, Registry hoặc ServiceProcess.ServiceBase lớp vv trong .NET là chương trình của bạn như vậy “nền tảng độc lập” và nhiều hơn nữa “tương thích” nếu bạn không sử dụng API bản địa? Có Thread.ApartmentState
ở mọi nơi có ý nghĩa trong Windows không?
Việc sử dụng SafeHandle
hoặc try {…} finally
là nguyên nhân bắt buộc. Tôi rất vui khi có định nghĩa chuẩn về API gốc trong bất kỳ biểu mẫu nào trong số này.
Tôi biết rằng một số cấu trúc trong windows.h
có các phiên bản khác nhau 32/64 hoặc XP/Vista vv Tôi nghĩ rằng nó sẽ là đủ để có phiên bản cũng khác nhau về cấu trúc Native như MIB_IPADDRROW_XP
và MIB_IPADDRROW_W2K
hoặc IMAGE_NT_HEADERS32
và IMAGE_NT_HEADERS64
(xem cùng tên trong tiêu đề cửa sổ).
Một trong những nguyên nhân nên sử dụng các lớp và phương thức .NET được quản lý nếu có. Thật đáng tiếc, nhưng việc thực hiện một số tính năng mạnh mẽ nhất của Windows có trong .NET được quản lý quá muộn và rất nhiều trong số đó được truy cập cho đến bây giờ chỉ trong thế giới không được quản lý. 10 năm trước tại một trong những hội nghị đầu tiên của Microsoft về .NET Tôi hỏi về sự ủng hộ của tôi Các tập tin được ánh xạ bộ nhớ. Chỉ .NET 4 hiện đã thực hiện MemoryMappedFile
lớp học (xem http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx). Các vấn đề tương tự tồn tại vĩnh viễn nếu một người viết các tiện ích cho mục đích quản trị. Ví dụ: mở tệp bằng CreateFile
và Gắn cờ FILE_FLAG_BACKUP_SEMANTICS
hoặc RegCreateKeyEx
với REG_OPTION_BACKUP_RESTORE
hoặc REG_OPTION_CREATE_LINK
. Các liên kết cứng và Các mối nối (xem http://msdn.microsoft.com/en-us/library/aa365006(v=VS.85).aspx) là các ví dụ tiếp theo. Một ví dụ khác: làm việc với Đối tượng công việc thay vì Quy trình (xem http://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx và http://www.microsoft.com/msj/0399/jobkernelobj/jobkernelobj.aspx). Nếu bạn muốn bắt đầu một quá trình và chờ đợi cho đến khi quá trình này, nhưng cũng cho đến khi tất cả các quy trình con của nó được kết thúc, công việc là rất hữu ích. Người ta có thể sử dụng CreateJobObject
và AssignProcessToJobObject
và sau đó sử dụng TerminateJobObject
hoặc WaitHandle
như phiên bản .NET của (WaitForSingleObject
).
Chỉ trong .NET 4.0 System.IntPtr
und System.UIntPtr
các lớp hỗ trợ các phương thức Add
và Subtract
.
Tôi có thể tiếp tục các ví dụ, nhưng tôi hy vọng bạn hiểu ý tôi. Vì vậy, Tôi muốn viết một chương trình .NET vì rất nhiều ưu điểm nhưng tôi có thể làm điều này không phải lúc nào cũng không cần sử dụng API gốc. Hơn nữa, đôi khi có yêu cầu của khách hàng đối với ngôn ngữ của việc triển khai phần mềm và tôi chọn cách thức cần thiết.
CẬP NHẬT 2: Microsoft đã cải thiện khả năng tương tác với COM trong .NET 4.0, nhưng không phải với API Windows giống như C. Tôi thấy một số cách để làm việc với P/Gọi dễ dàng hơn. Cách nào để làm điều này bạn thấy? Tôi đề xuất ba hướng mà tôi thấy:
- Một trong những công cụ lắp ráp có tuyên bố tất cả (hoặc quan trọng nhất) chưa được triển khai đầy đủ trong .NET Windows API. Sự tập hợp này có thể chỉ có siêu dữ liệu (hoặc gần như duy nhất) của lớp Native tĩnh với các hàm tĩnh và các lớp/cấu trúc tương ứng. Hội đồng này có thể được đặt trong GAC và mọi người đều có thể sử dụng nó. (Bằng cách này tôi đã thử nghiệm. Nó hoạt động rất tốt.)
- Thực hiện một tập hợp các đoạn mã với khai báo và các mẫu sử dụng API Windows gốc khác nhau.
- Bắt đầu một dự án mã nguồn mở trên www.codeplex.com, nơi tạo một lớp .NET và các phương thức mở rộng cho một số API Windows quan trọng nhất mà chưa được triển khai trong .NET.
Tôi chắc chắn rằng tồn tại nhiều cách hơn để giúp nhà phát triển dễ dàng sử dụng API Windows gốc hơn. Các đề xuất khác được hoan nghênh.
Vì lý do nào đó bất cứ khi nào tôi cần một cái gì đó đặc biệt được thực hiện, điều này xảy ra khá thường xuyên, tôi sẽ sử dụng các cuộc gọi Win32 "kế thừa" để thực hiện phép thuật. Trong khi tôi đang viết này tôi đang tìm ra cách để làm cho cửa sổ WPF của tôi dính như winamp ... muốn thư viện .net đã làm điều đó cho tôi. – m0s