Frage

Kann Standard-Zeiger in .Net dies tun? Oder braucht man zu P greifen / aufrufen?

Beachten Sie, dass ich nicht über Objektreferenzen sprechen; Ich spreche über tatsächliche C # Zeiger in unsicheren Code.

War es hilfreich?

Lösung

C #, als verwalteter und Laufzeitmaschine geschützt, erlaubt keine geringe Hardwarezugriff und die Speicherplätze mit den tatsächlichen Hardware verbunden sind, sind nicht verfügbar.

Sie müssen einen Port-Treiber verwenden oder eigene in C ++ oder C mit dem richtigen Windows-API schreiben Sie an den E / A-Bereiche von Interesse abgebildet Speicher zugreifen. Dies wird in einem unteren Ring läuft als die C # Programme sind in der Lage.

Dies ist, warum Sie sehen Treiber nicht in C # geschrieben, obwohl ich viele schreiben, Zugriffsroutinen mit C ++, aber die Haupttreiber Logik in C # verstehen. Es ist schwierig, obwohl, wie Abstürze und Neustarten kann schwierig werden, nicht die Synchronisation und Timing-Probleme (die etwas konkretere in C ++ auf einem unteren Ring, obwohl Fenster weit von einem Echtzeit-System sind) zu nennen.

-Adam

Andere Tipps

Adams Antwort zu erweitern , man kann nicht einmal Memory-Mapped I / O aus einer Win32-Anwendung ohne die Mitwirkung eines Kernel-Treiber auszuführen. Alle Adressen ein Win32-App bekommt sind virtuelle Adressen, die nichts mit physischen Adressen zu tun haben.

Sie müssen entweder einen Kernel-Treiber schreiben, zu tun, was du redest oder ein Treiber installiert, die eine API, die Sie machen Anfragen für I / O gegen bestimmte physikalische Adressen werden lassen (und ein solcher Treiber wäre ein ziemlich großes Sicherheitsloch Warte passieren, ich kann mir vorstellen). Ich scheine, dass die Art und Weise zurück zu erinnern, wenn einige Outfit einen solchen Treiber als Teil eines Entwicklungs-Kit hatte Port Legacy-DOS / Win16 oder was auch immer Gerätecode zu Win32 zu helfen. Ich erinnere mich nicht seinen Namen oder wissen, ob es noch da ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top