Различие между LoadFile и LoadFrom с блоками.NET?

119
задан Ruben Bartelink 1 September 2010 в 11:44
поделиться

3 ответа

Это проясняет?

// 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 ,

92
ответ дан 24 November 2019 в 01:50
поделиться

Из блога Сюзанны Кук :

LoadFile vs. LoadFrom

Будьте осторожны - это не одно и то же вещь.

LoadFrom () проходит через Fusion и может быть перенаправлен на другой сборка по другому пути, но с та же личность, если она уже загружается в контекст LoadFrom.

LoadFile () вообще не связывается через Fusion - загрузчик просто впереди и загружает именно * то, что звонящий запросил. Он не использует либо Load, либо LoadFrom контекст.

Итак, LoadFrom () обычно дает вам то, что вы просили, но не обязательно. LoadFile () для тех, кто действительно действительно хочу именно то, что просят. (* Однако, начиная с версии 2, политика будет применяться к LoadFrom () и LoadFile (), поэтому LoadFile () не будет обязательно быть именно тем, что было просил. Кроме того, начиная с версии 2, если сборка с ее идентификатором находится в GAC, будет использоваться копия GAC вместо. Используйте ReflectionOnlyLoadFrom () чтобы загрузить именно то, что вы хотите - но, обратите внимание, что сборки загружаются таким образом не может быть выполнено.)

LoadFile () имеет ловушку. С тех пор не использует контекст привязки, его зависимости не автоматически нашел в своем каталоге. Если они не доступны в контексте загрузки, вы пришлось бы подписаться на AssemblyResolve для привязки

См. здесь .

См. также статью Выбор контекста привязки в том же блоге.

60
ответ дан 24 November 2019 в 01:50
поделиться

.NET имеет другой контекст загрузки. Сюзанна Кук написала о них здесь: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

Таким образом, карантин .Net не перепутывает ссылки.

1
ответ дан 24 November 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: