문제

.NET의 표준 포인터가 이것을 할 수 있습니까? 아니면 P/Invoke에 의지해야합니까?

나는 객체 참조에 대해 이야기하고 있지 않습니다. 안전하지 않은 코드의 실제 C# 포인터에 대해 이야기하고 있습니다.

도움이 되었습니까?

해결책

C#은 관리 및 보호 된 런 타임 엔진으로서 낮은 수준의 하드웨어 액세스를 허용하지 않으며 실제 하드웨어와 관련된 메모리 위치를 사용할 수 없습니다.

관심있는 I/O 영역에 액세스하려면 포트 드라이버를 사용하거나 적절한 Windows API와 함께 C ++ 또는 C로 직접 작성해야합니다. 이것은 C# 프로그램이 할 수있는 것보다 낮은 링에서 실행됩니다.

그렇기 때문에 C#로 작성된 드라이버를 보지 못하는 이유입니다. 많은 사람들이 C ++로 액세스 루틴을 작성하고 있지만 C#의 주요 드라이버 로직을 이해하고 있습니다. 그러나 충돌과 재시작이 까다로워 질 수 있기 때문에 까다로워 질 수 있습니다. 동기화 및 타이밍 문제는 말할 것도없고 (Windows가 실시간 시스템과는 거리가 멀지 만 더 낮은 링에서 C ++에서 다소 콘크리트입니다).

-아담

다른 팁

확장하기 위해 아담의 대답, 커널 드라이버의 협력 없이는 Win32 애플리케이션에서 메모리 매핑 I/O를 수행 할 수 없습니다. Win32 앱이 얻는 모든 주소는 물리적 주소와 관련이없는 가상 주소입니다.

당신은 당신이 말하는 일을하기 위해 커널 드라이버를 작성해야하거나, 운전자가 설치되어 있어야, API가있는 운전자가 특정 물리적 주소에 대해 I/O에 대한 요청을 할 수 있습니다 (그리고 그러한 드라이버는 꽤 큰 것입니다. 보안 홀이 일어나기를 기다리고 있습니다. 일부 의상이 포트 레거시 DOS/WIN16 또는 Win32의 장치 코드를 돕기 위해 개발 키트의 일환으로 드라이버를 가졌을 때 그런 식으로 돌아 오는 것 같습니다. 나는 그 이름을 기억하지 못하거나 그것이 여전히 주변에 있는지 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top