2012-02-21 22 views
1

我開始深入一些Windows 7驅動程序開發。有一點不清楚的是託管代碼程序如何訪問驅動程序中的信息(例如與數字I/O卡進行通信)。例如,驅動程序(內核或用戶模式)將管理對PCI/PCIe卡上寄存器的訪問,但是必須向編寫託管代碼的程序員提供寄存器數據的讀取/寫入(C#,VB .NET)通過一個.NET類。從託管代碼與設備驅動程序的接口 - 無P/Invoke?

我不想在Win32API調用中使用P/Invoke。

這是一個內存共享(IOCTL)的問題,我使用中間託管DLL來「隱藏」P/Invoke,還是有一些簡單的東西我錯過了?

謝謝!

回答

1

如果您想深入研究Windows 7驅動程序,請不要使用託管代碼。但如果你的意思是你想調用某些驅動程序的功能,你可以使用各種技術,P/Invoke可能是最簡單的。

原因很簡單:設備驅動程序的本質是非託管的,因此您需要使用像P/Invoke這樣的技術。這裏有一個how you can invoke device drivers的例子。這裏是how to talk to a USB device

我瞭解你對P/Invoke的怨恨。但不知何故,你需要彌合託管和非託管之間的差距。你可以通過手工(使用你自己的封送器和所有東西)來完成,但是我建議你只有在正常的P/Invoke不適合這項工作時才應該採用。當然,您可以通過製作精簡的界面組合來隱藏複雜性,然後您可以從託管代碼中自由調用這個自制庫。

+0

感謝您的回覆。我對非託管驅動程序代碼的開發很好;就像你所說的那樣,如果沒有p/invoke,就沒有得到「彌合託管和非託管之間的差距」。我一直使用來自第三方供應商的硬件驅動程序,而不必在C#中使用p/invoke。他們是否總是將p/invoke隱藏在一組中間類中? – ddechow 2012-02-21 17:57:00

+0

@ddechow:如果你可以不使用P/Invoke,那麼顯然這些驅動程序供應商已經爲你提供了一些爲你建橋的庫。如果你想知道,給他們打電話,或者在他們提供的任何組件上使用Reflector。恐怕我無法告訴你你的驅動程序供應商是如何做到這一點的,因爲我不知道供應商,驅動程序和libs。 – Abel 2012-02-22 10:50:20