Une approche bien que je l'ai utilisé ces derniers temps est d'ajouter un gestionnaire d'événements pour l'événement AssemblyResolve du AppDomain.
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Ensuite, dans la méthode de gestionnaire d'événements, vous pouvez charger l'assemblée qui a été tenté de résoudre en utilisant l'un des Assembly.Load, remplacements de Assembly.LoadFrom et retour de la méthode.
EDIT:
En fonction de vos informations supplémentaires, je pense en utilisant la technique ci-dessus, la résolution spécifiquement les références à une assemblée vous est la seule véritable approche qui va travailler sans restructuration de votre application. Ce qu'il vous donne c'est que l'emplacement de chaque assembly que le CLR ne parvient pas à résoudre peut être déterminé et chargé par votre code lors de l'exécution ... J'ai utilisé ceci dans des situations similaires pour les architectures enfichables et pour une intégrité de référence d'assembly outil d'analyse.
Un bon exemple de cette technique est l'application LINQPad. Il est livré en tant qu'exe unique, de sorte que toutes les bibliothèques sont incluses en tant que ressources intégrées. Voir http://www.albahari.com/nutshell/ch16.aspx pour le code et http://www.linqpad.net/HowLINQPadWorks.aspx pour un aperçu. – Pat