2016-08-17 4 views
0

У нас есть две одинаковые DLL в отдельных папках.Assembly.ReflectionOnlyLoadFrom (assemblyPath) .GetName() VS Assembly.LoadFrom (assemblyPath) .GetName()

Когда мы загружаем второй DLLs с помощью

Assembly.ReflectionOnlyLoadFrom(assemblyPath) 

мы получаем ошибку:

"API restriction: The assembly 'file.dll' has already loaded from a different location. It cannot be loaded from a new location within the same appdomain." 

что вполне понятно, но когда мы делаем:

Assembly.LoadFrom(assemblyPath); 

он работает отлично.

Почему? что изменится с помощью метода «ReflectionOnly».

В нашем случае единственным использованием будет использование метода GetName() для результата, и я предполагаю, что в этом случае результат должен быть строго таким же?

Благодаря

+0

Возможный дубликат - http://stackoverflow.com/questions/305835/c-sharp-assembly-load-vs-assembly-reflectiononlyload –

+0

@ Допустим, что в вопросе упоминаются те же самые имена методов, что это не означает, что это дублировать. [Вопрос, на который вы ссылаетесь] (http://stackoverflow.com/questions/305835/c-sharp-assembly-load-vs-assembly-reflectiononlyload) спрашивает об ошибках при использовании 'ReflectionOnlyLoadFrom()'. – CodeCaster

ответ

1

При загрузке сборки для ReflectionOnly только метаданные загружается. Это позволяет вам проверять его типы, но не создавать или выполнять какие-либо из них.

Существует также property indicating whether an assembly was loaded for reflection only.

Так что на AppDomain сборка может быть загружена один раз: либо полностью, либо только для отражения. Учитывая, что он уже полностью загружен, вы не можете загрузить его снова только для отражения.

Призыв к Assembly.LoadFrom(), даже при наличии двух разных путей, будет загружать одну и ту же сборку один раз, если они соответствуют версии. См. Также Side effects of calling Assembly.Load multiple times.

См. Также: MSDN: How to: Load Assemblies into the Reflection-Only Context.