This could be caused by any number of things, MSDN has it said as:
TypeLoadException is thrown when the common language runtime cannot find the assembly, the type within the assembly, or cannot load the type.
So it's clear that a type can't be found, either the assembly is missing, the type is missing or there's a clash between runtime configurations.
Sometimes the issue can arise because the assembly you're referencing is a different platform type (32bit / 64bit etc) than the one you're consuming from.
I would recommend catching the exception and examining it in more detail to identify what it's having trouble with.
Further to my previous information
Sometimes I've seen this issue arise because (for one reason or another) a referenced assembly can't actually be resolved, even though it's referenced and loaded.
I typically see this when AppDomain boundaries are involved.
One way I've found that sometimes resolves the issue (but only if the assembly is already in the AppDomain) is this code snippet:
AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
return AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(asm => asm.FullName == e.Name);
}
Like I said, I see this issue when AppDomains get involved and this does seem to solve it when the assembly is indeed already referenced and loaded. I've no idea why the framework fails to resolve the reference itself.