.Net 中的标准指针可以做到这一点吗?还是需要求助于 P/invoke?
请注意,我不是在谈论对象引用。我说的是不安全代码中的实际 C# 指针。
C# 作为托管和受保护的运行时引擎,不允许低级硬件访问,并且与实际硬件相关的内存位置不可用。
您需要使用端口驱动程序或使用适当的 Windows API 用 C++ 或 C 编写自己的驱动程序,以访问感兴趣的内存映射 I/O 区域。这将在比 C# 程序能力更低的环中运行。
这就是为什么你看不到用 C# 编写的驱动程序的原因,虽然我知道很多人是用 C++ 编写访问例程,但主要的驱动程序逻辑是用 C# 编写的。不过,这很棘手,因为崩溃和重新启动可能会变得很棘手,更不用说同步和计时问题(在 C++ 中,这些问题在较低的环上更为具体,即使 Windows 与实时系统相去甚远)。
-亚当
为了扩展Adam 的答案,如果没有内核驱动程序的合作,您甚至无法从 Win32 应用程序执行内存映射 I/O。Win32 应用程序获得的所有地址都是与物理地址无关的虚拟地址。
您要么需要编写一个内核驱动程序来执行您正在谈论的事情,要么安装一个具有 API 的驱动程序,该 API 可以让您针对特定物理地址发出 I/O 请求(这样的驱动程序将非常大安全漏洞等待发生,我想)。我似乎还记得,当一些公司将这样的驱动程序作为开发工具包的一部分来帮助将旧版 DOS/Win16 或任何设备代码移植到 Win32 时,我似乎记得那样。我不记得它的名字,也不知道它是否还在。