Avoid using LoadFrom as much as possible. When your calling code has a reference to Figures.dll and you open it again with Assembly.LoadFrom, you end up having two Figures.dll loaded in memory. The two are loaded into different contexts (one is the Load context and one is the LoadFrom context with a codebase specified) and because of this the Types are not compatible.
http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspxYour best choice is to stop doing unnecessary reflection. Second best is use typeof(Square).Assembly to get to the assembly. Finally if you absolutely must load an assembly via a path, do it like so:
AssemblyName asmName = Assemblyname.GetAssemblyName( "D:\\Figures.dll" );
Assembly asm = Assembly.Load( asmName );
This loads the new assembly into the Load context. Because it's the same context as everything else, it won't actually load your Figures.dll a second time if it's already loaded.