Want to access a physical device (COM port, tape drive, LPT port, anything...) using C# .net?
You can't. Not natively anyway:
FileStream fs = File.Open("
\\\\.\\COM1", FileMode.Open, FileAccess.ReadWrite, FileShare.None);Happily errors out saying you can't use the \\.\ format with a FileStream (\\.\ becomes \\\\.\\ when you escape the backspaces with more backspaces).
FileStream does however allow opening a handle, so all is not lost, you can simply use the format:
FileStream fs =
new FileStream(handle, FileAccess.ReadWrite);After opening the handle using a CreateFile API call. To use this API call you need to platform invoke it, which is easily done once you look at the docs for it:
[DllImport("Kernel32.dll")]
static extern IntPtr CreateFile(string filename, [MarshalAs(UnmanagedType.U4)]FileAccess fileaccess, [MarshalAs(UnmanagedType.U4)]FileShare fileshare, int securityattributes, [MarshalAs(UnmanagedType.U4)]FileMode creationdisposition, int flags, IntPtr template);
(http://www.pinvoke.net/ is a great place to cheat)
You can then get handle (note that rather than defining the actual handle variable I'm going to put the CreateFile call inside the FileStream constructor - you could instead do InPtr handle = CreateFile() etc) by using CreateFile:
FileStream fs = new FileStream(CreateFile("\\\\.\\COM1", FileAccess.ReadWrite, FileShare.ReadWrite, 0, FileMode.Create, 0, IntPtr.Zero), FileAccess.ReadWrite);
First timers should remember to update their using statements, one for the FileStream, and one for the [DllImport]:
using System.IO;
using System.Runtime.InteropServices;