I've seen a few posts on other blogs commenting on the lack of a ReadOnlyDictionary in the .NET framework, often with implementations which wrap a regular Dictionary and prevent modification. I thought I'd point out a solution to this problem which is provided in the Base Class Library:
IEnumerable<KeyValuePair<TKey, TValue>>
That's it. And it's what's returned if you call dictionary.AsEnumerable(). The consumer of your class can convert it back into a Dictionary by passing it into one of the Dictionary constructor overloads, or by calling the ToDictionary LINQ extension method.
The same is true of all collection classes: if you don't want people to modify your internal List, Collection, Array, Hash Set or whatever it may be, just call AsEnumerable and give them that; they can convert it into whatever type of collection they like at their end.
BTW, the same is true of function parameters: if all you're going to do is foreach through a list, then your parameter type should be IEnumerable<T>, rather than List<T> or IList<T>.