Это проясняет?
// path1 and path2 point to different copies of the same assembly on disk:
Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);
// These both point to the assembly from path1, so this is true
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);
assembly1 = Assembly.LoadFile(path1);
assembly2 = Assembly.LoadFile(path2);
// These point to different assemblies now, so this is false
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);
Изменить : чтобы ответить на вопросы, которые вы подняли в своем измененном вопросе, вы определенно хотите прочитать Сюзанна Кук об идентичности сборки .
Существует множество правил, регулирующих загрузку сборок, и некоторые из них связаны с тем, как они разрешают зависимости - если ваша AssemblyA зависит от AssemblyB, где .NET должна искать AssemblyB? В глобальном кэше сборок, в том же каталоге, в котором была обнаружена AssemblyA, или в другом месте? Более того, если он находит несколько копий этой сборки, как ему выбирать, какую из них использовать?
LoadFrom
имеет один набор правил, а LoadFile
имеет другой набор правил. Трудно представить много причин для использования LoadFile
,
Из блога Сюзанны Кук :
LoadFile vs. LoadFrom
Будьте осторожны - это не одно и то же вещь.
LoadFrom () проходит через Fusion и может быть перенаправлен на другой сборка по другому пути, но с та же личность, если она уже загружается в контекст LoadFrom.
LoadFile () вообще не связывается через Fusion - загрузчик просто впереди и загружает именно * то, что звонящий запросил. Он не использует либо Load, либо LoadFrom контекст.
Итак, LoadFrom () обычно дает вам то, что вы просили, но не обязательно. LoadFile () для тех, кто действительно действительно хочу именно то, что просят. (* Однако, начиная с версии 2, политика будет применяться к LoadFrom () и LoadFile (), поэтому LoadFile () не будет обязательно быть именно тем, что было просил. Кроме того, начиная с версии 2, если сборка с ее идентификатором находится в GAC, будет использоваться копия GAC вместо. Используйте ReflectionOnlyLoadFrom () чтобы загрузить именно то, что вы хотите - но, обратите внимание, что сборки загружаются таким образом не может быть выполнено.)
LoadFile () имеет ловушку. С тех пор не использует контекст привязки, его зависимости не автоматически нашел в своем каталоге. Если они не доступны в контексте загрузки, вы пришлось бы подписаться на AssemblyResolve для привязки
См. здесь .
См. также статью Выбор контекста привязки в том же блоге.
.NET имеет другой контекст загрузки. Сюзанна Кук написала о них здесь: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
Таким образом, карантин .Net не перепутывает ссылки.