Assemblies establish a boundary for the visibility of types. As part of its declaration, a type states whether it is visible to callers outside its assembly, or whether visibility is restricted only to callers within the same assembly. These visibility rules are enforced at runtime.