Разница между LoadFile и LoadFrom with.NET Собрания?



Я смотрел на документацию msdn, и я все еще немного смущен тем, в чем именно заключается разница между использованием LoadFile и LoadFrom при загрузке сборки. Может ли кто-нибудь привести пример или аналогию, чтобы лучше описать его. Документация MSDN смутила меня больше. Кроме Того, Это ReflectionOnlyLoadFrom то же, что и LoadFrom за исключением того, что он загружает сборку только в режиме отражения.



так как мой опыт .NET не самый большой, вот некоторые вопросы, касающиеся MSDN документация с помощью LoadFile:



1) Что это значит LoadFile проверяет сборки, которые имеют одинаковый идентификатор, но расположены по разным путям? Что такое идентичность (пример)?



2) в нем говорится LoadFile не загружает файлы в контекст LoadFrom и не разрешает зависимости, используя путь загрузки. Что это значит, может ли кто-нибудь привести пример?



3) Наконец, в нем говорится, что LoadFile полезно в данном случае, потому что LoadFrom не может загружать сборки, которые имеют одинаковые идентификаторы, но разные пути; он будет загружать только первую такую сборку, что снова приводит меня к тому же вопросу, Что такое идентификатор сборок?

602   8  

8 ответов:

это проясняет ситуацию?

// 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);

Edit: чтобы ответить на вопросы, которые вы подняли в своем пересмотренном вопросе, вы определенно хотите прочитать Сюзанна Кук на сборке идентичности.

есть много правил, которые управляют тем, как загружаются сборки, и некоторые из них связаны с тем, как они разрешают зависимости - если ваша сборка зависит от AssemblyB, где .NET должен искать AssemblyB? В глобальном кэше сборок, тот же каталог он нашел ассемблера, или где-то еще совсем? Кроме того, если он находит несколько копий этой сборки, как он должен выбрать, какой из них использовать?

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

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

LoadFile против LoadFrom

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

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

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

Итак, LoadFrom () обычно дает вам то, что вы просили, но не обязательно. Командами() для тех, кто действительно, очень хочется именно того, что просят. (*Однако, начиная с версии 2, политика будет применяется как к LoadFrom (), так и LoadFile (), поэтому LoadFile () не будет обязательно именно то, что было запрошенный. Кроме того, начиная с v2, если сборка со своим идентификатором находится в ГЛОБАЛЬНЫЙ КЭШ СБОРОК, копия GAC будет использоваться вместо. Используйте ReflectionOnlyLoadFrom() чтобы загрузить именно то, что вы хотите-но, обратите внимание, что сборки загружаются таким образом не может быть исполнен.)

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

посмотреть здесь.

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

после многих царапин в голове я обнаружил разницу сам сегодня днем.

Я хотел загрузить DLL во время выполнения, и DLL жил в другом каталоге. Эта DLL имела свои собственные зависимости (DLL), которые также жили в том же каталоге.

LoadFile (): загружена конкретная DLL, но не зависимости. Поэтому, когда первый вызов был сделан из DLL в одну из этих других DLL, он бросил исключение FileNotFoundException.

LoadFrom(): Загружается DLL, которую я указал, а также все зависимости, которые жили в этом каталоге.

одно отличие, которое я заметил, это:

сборка.Командами - загружает сборку в другой домен приложения с ограниченными правами пользователя (принцип diffrence). такие операции, как серилизация/десерилизация, не могут быть выполнены.

сборка.LoadFrom - загружает сборку в том же домене приложения с теми же правами пользователя (тот же принцип).

Примечание: Если одна сборка загружается с использованием пути 8.3, а затем из пути не 8.3, они будут рассматриваться как разные сборки, даже если они являются одной и той же физической DLL.

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

Это способ .Net карантины, что ссылки не смешиваются.

в моем случае мне просто нужно было просто удалить кэш приложения ASP, расположенный @ C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files. Он перестраивается при первом запуске сайта. Будьте уверены, чтобы остановить службы IIS.

надеюсь, это поможет кому-то, как это было для меня.

согласно документации:

LoadFile (String): загружает содержимое файла сборки с заданным путем к файлу.

LoadFrom (String): загружает сборку с заданным именем файла или путем.

Comments

    Ничего не найдено.