The following saying is quoted from [this article](http://msdn.microsoft.com/en-us/magazine/cc163583.aspx) in MSDN.

> 
> ... strong-name signing makes servicing more complicated. Under
>  current versioning policy, an assembly will always attempt to load the
>  exact version of the assembly it was built against. If, for example,
>  your application was built against version 1.0.0.0 of a strong-named
>  assembly and you fix a bug in the assembly, bumping the version number
>  to 1.0.0.1, the existing application will not find the updated
>  assembly.
> 
> 
> 

Now, suppose that two strong-named assemblies (written in C# or VB.net), namely X and Y, exist and X depends on Y.

1. Does the version of Y is stored somewhere in X in compile time?
2. Does the public key used in Y is stored somewhere in X to avoid code
change attacks?
3. If the version of Y is checked when CLR loads it, what happens if Y
is loaded dynamically and there is no compile time referencing?

Please post references in your answers, if possible.