3

.Net の標準ポインタはこれを行うことができますか? それとも、P/invoke に頼る必要がありますか?

オブジェクト参照について話しているのではないことに注意してください。アンセーフ コード内の実際の C# ポインターについて話しています。

4

2 に答える 2

5

C# は、マネージおよび保護されたランタイム エンジンとして、低レベルのハードウェア アクセスを許可せず、実際のハードウェアに関連付けられたメモリ ロケーションは使用できません。

目的のメモリ マップド I/O 領域にアクセスするには、ポート ドライバーを使用するか、適切な Windows API を使用して C++ または C で独自のドライバーを作成する必要があります。これは、C# プログラムが実行できるよりも低いリングで実行されます。

多くの人がアクセス ルーチンを C++ で記述していることは理解していますが、主要なドライバー ロジックは C# で記述しています。ただし、同期とタイミングの問題は言うまでもなく、クラッシュと再起動が難しくなる可能性があるため、注意が必要です (Windows はリアルタイム システムとはかけ離れていますが、下位リングでは C++ ではより具体的です)。

-アダム

于 2008-10-16T03:15:47.213 に答える
3

Adam の回答を拡張するには、カーネル ドライバーの協力がなければ、Win32 アプリケーションからメモリ マップド I/O を実行することさえできません。Win32 アプリが取得するすべてのアドレスは、物理アドレスとは関係のない仮想アドレスです。

あなたが話していることを行うには、カーネルドライバーを作成するか、特定の物理アドレスに対して I/O の要求を行うことができる API を持つドライバーをインストールする必要があります (そのようなドライバーはかなり大きなものになるでしょう)。セキュリティホールが発生するのを待っていると思います)。以前の DOS/Win16 やその他のデバイス コードを Win32 に移植するのに役立つ開発キットの一部として、一部の組織がそのようなドライバーを持っていたときのことを思い出すようです。名前も覚えていませんし、今もあるかどうかもわかりません。

于 2008-10-16T04:35:06.413 に答える