C #, как управляемый и защищенный механизм времени выполнения, не разрешает низкоуровневый доступ к оборудованию, а области памяти, связанные с фактическим оборудованием, недоступны.
Вам потребуется использовать драйвер порта или написать свой собственный на C ++ или C с соответствующим Windows API для доступа к интересующим областям ввода-вывода с отображением в памяти. Это будет работать в более низком кольце, чем способны программы на C #.
Вот почему вы не видите драйверов, написанных на C #, хотя я понимаю, что многие пишут подпрограммы доступа на C ++, но основная логика драйверов в C #. Однако это сложно, так как сбои и перезапуск могут стать хитрыми, не говоря уже о проблемах синхронизации и синхронизации (которые несколько более конкретны в C ++ на более низком уровне, даже если Windows далека от системы реального времени).
-Adam