I'd suggest using internal constructors and do caller validation in a factory class.
IL is just register-less, processor agnostic assembly code. It has nothing to do with making it easy to use the code elsewhere. It's the .NET metadata contained in the assemblies that does that.
When you obfuscate an assembly, it only obfuscates internal names, not any publicly available names. Otherwise it would break any DLL you obfuscate.