Hi Keith,
You can think of read-only as runtime constant & a const as compile constant.
A read-only(runtime constant) is usually a better choice than using a const(compile constant).
A const will give a slight performance gain, but nothing worth caring.
A const can only be used for primitive types(int, double, etc..)
Readonly can be any type, and can be used as instance constants.
Another advantage is readonly constants reference the readonly variable which are resolved at runtime.
Using a AutoCAD example if you have a library that uses P/Invoke and contains a constant like "acad.exe".
When you reference that library into a application and compile it the compiler creates IL that stores "acad.exe" directly in the assembly.
If you update the library to "accoremgd.dll" and distribute new library a application that was built with previous version will still use "acad.exe", and would require the application to be re-built to update the value.
If a read-only was used the application that references the new library would get the new value through the read-only variable which is evaluated at runtime and would use new value, without having to rebuild the application since it does not "bake-in" read-only constants into the assembly.