Singleton with readonly parameters
Disclaimer: I am biased towards singletons. I think it is an anti-pattern, that has no place in modern C#.

First, here is a great article on how singletons become a disaster when you try to unit test a code, that heavily relies on them. Your case is even more complex, because you also have to initialize additional parameters. And you can't change those. So you can't test Host with different "environments" unless you try to bypass your own exception with reflection.

I would just register non-static Host class as singleton inside IoC container, and be done with it. It will solve all your problems:


Parameters of Host are no longer exposed.
Container guaranties, that there is going to be a single instance of Host.
Host is exposed as service (IHost) and not as implementation (Host).
You can mock IHost in unit tests.
You can easily unit-test Host implementation with whatever parameters you want, because now it has public constructor and can be re-created as often as it is required by your tests.
Classes that depend on IHost will now require it as dependency, instead of secretly accessing it via global static property.