Я смотрел документацию msdn, и я все еще немного смущен тем, в чем именно разница между использованием LoadFile
и LoadFrom
загрузкой сборки. Может ли кто-нибудь привести пример или аналогию, чтобы лучше описать это. Документация MSDN смутила меня больше. Кроме того, это ReflectionOnlyLoadFrom
то же самое, LoadFrom
за исключением того, что он загружает сборку только в режиме отражения.
Поскольку мой опыт работы с .NET не самый лучший, вот несколько вопросов относительно документации MSDN с использованием LoadFile:
1) Что означает LoadFile
проверка сборок с одинаковым идентификатором, но расположенных по разным путям? Какая личность (пример)?
2) Он заявляет, что LoadFile
не загружает файлы в «контекст LoadFrom» и не разрешает зависимости с использованием пути загрузки. Что это значит, может кто-нибудь привести пример?
3) Наконец, в нем говорится, что LoadFile
это полезно в этом ограниченном сценарии, поскольку LoadFrom не может загружать сборки с одинаковыми идентификаторами, но разными путями; он загрузит только первую такую сборку, что снова подводит меня к тому же вопросу, какова идентичность сборок?
Ответы:
Это проясняет?
Изменить : чтобы ответить на вопросы, которые вы подняли в своем пересмотренном вопросе, вы определенно захотите прочитать Сюзанну Кук об идентичности сборки .
Существует множество правил, регулирующих загрузку сборок, и некоторые из них связаны с тем, как они разрешают зависимости - если ваша AssemblyA зависит от AssemblyB, где .NET должна искать AssemblyB? В глобальном кэше сборок, в том же каталоге, в котором он нашел AssemblyA, или в другом месте? Более того, если он находит несколько копий этой сборки, как ему выбирать, какую из них использовать?
LoadFrom
имеет один набор правил, аLoadFile
другой набор правил. Трудно вообразить множество причин для использованияLoadFile
, но если вам нужно было использовать отражение на разных копиях одной и той же сборки, оно есть для вас.источник
string.Compare(x, y) == 0
? Думаю, ты хочешьx == y
туда? Если по непонятным причинам вам действительно нужна проверка равенства, зависящая от языка и региональных параметров, это будет более понятноstring.Equals(x, y, StringComparison.CurrentCulture)
, например, написать .Из блога Сюзанны Кук :
Смотрите здесь .
Также см. Статью « Выбор связующего контекста» в том же блоге.
источник
После долгих размышлений сегодня днем я сам обнаружил разницу.
Я хотел загрузить DLL во время выполнения, а DLL жила в другом каталоге. У этой DLL были свои собственные зависимости (DLL), которые также находились в том же каталоге.
LoadFile (): загружена конкретная DLL, но не зависимости. Поэтому, когда был сделан первый вызов одной из этих DLL из библиотеки DLL, она вызвала исключение FileNotFoundException.
LoadFrom (): загрузил указанную мной DLL, а также все зависимости, которые находились в этом каталоге.
источник
FileNotFoundException
при создании нового экземпляра объекта, определенного в сборке, на которую ссылается сборка, которую я только что загрузил.LoadFile
. Изменение этого на,.LoadFrom
похоже, решило проблему, но я не знал почему! СпасибоПримечание. Если одна сборка загружается с использованием пути 8.3, а затем пути, отличного от 8.3, они будут рассматриваться как разные сборки, даже если это одна и та же физическая библиотека DLL.
источник
.NET имеет другой контекст загрузки. Сюзанна Кук писала о них здесь: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
Таким образом не перепутываются карантины .Net, в которых ссылки не перепутались.
источник
одно отличие, которое я заметил:
Assembly.LoadFile - загружает сборку в другой домен приложения с ограниченными правами пользователя (принцип различия). такие операции, как серилизация / десерилизация, не могут быть выполнены.
Assembly.LoadFrom - загружает сборку в один и тот же домен приложения с одинаковыми правами пользователя (тот же принцип).
источник
В моем случае мне просто нужно было просто удалить кеш приложения ASP, расположенный @
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. Он перестраивается при первом запуске сайта. Обязательно сначала остановите IIS.Надеюсь, это поможет кому-то так же, как и мне.
источник