In short: const is set at compile time, readonly is set at runtime.

There’s a very important difference
between referencing consts and readonlys declared in a
different assembly: the const value is copied at compile time, while readonly is referenced at runtime.

Usually this difference won’t mean a
lot, but if you’re recompiling a referenced
assembly which has an updated const, then all referencing
assemblies will continue using ”the old const value” unless you
recompile them too. This could be the difference between being able
to drop-in a new assembly to fix a bug without re-deploying a full
system and not being able to …

A readonly will reference the value from the referenced assembly and therefore dropping-in only that assembly will be effective.

There are, however, drawbacks to using readonly, e.g. TestCase attributes (NUnit tests) can’t use them – only const is allowed. Attributes are set at compile time and not evaluated.