2016-12-20 3 views
0

У меня есть служба, которая включает загрузку сборки из облачного хранилища, создание экземпляра ее с помощью Activator.CreateInstance, а затем вызов метода на нем.Почему событие AssemblyResolve пытается решить сборку, которая уже загружена в AppDomain?

Я установил метод AssemblyResolve для загрузки зависимостей, которые отлично работают, но для тестирования/эксперимента. Теперь я пытаюсь вручную загрузить сборки. Я дошел до вывода, которые необходимы зависимости, загрузив их, а затем загружать их с помощью

Assembly.Load(byte[]) 

После чего я могу видеть, что они будут загружены в AppDomain с помощью

AppDomain.CurrentDomain.GetAssemblies()) 

Однако, когда я вызова метод на сборке, который ссылается на это, он по-прежнему относится к AssemblyResolver.

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

Почему он не может «видеть» его? Версия и имя и т. Д. - то же самое.

Я прочитал о различных контекстах привязки сборки here, и я думаю, что это может быть проблемой? Он предполагает, что использование Assembly.Load (string) будет загружаться в другой контекст, чем Assembly.Load (byte)? В этом случае, как это сделать, когда у меня есть сборка в памяти в виде байта []?

Благодаря

+0

Не удается загрузить сборку, даже если вы уже используете Assembly.Load (..) без каких-либо исключений? – Redhead

+0

Можете ли вы показать скриншот экрана 'Debug-> Widnows-> Modules' в Visual Studio после того, как сборка была загружена с помощью assebly selected? –

+0

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

ответ

0

Вы должны получить тип непосредственно из узла, который вы загрузили, так как он не загружен в правильный контекст.

var assembly = Assembly.Load(File.ReadAllBytes(some_path)); 

// This will work. Note that you don't need the assembly-qualified name, 
// as you are asking the assembly directly for the type. 
var type1 = assembly.GetType("My.Special.Type"); 

// This will not work - the assembly "My.Assembly" is not loaded into 
// the Load context, so the type is not available. 
var type2 = Type.GetType("My.Special.Type, My.Assembly"); 

В приведенном выше коде, type1 будет иметь ссылку на тип, но type2 будет нулевым, так как сборка не загружается в нормальном контексте нагрузки.

+0

Это то, что мы делаем с сборкой, которую мы фактически запускаем, проблема в том, что зависимости, которые я загрузил с помощью Assembly.Load (byte []), по-видимому, не могут поэтому, когда я запускаю метод из этого типа, он запускает событие AssemblyResolve, даже если необходимые ему сборки уже загружены в AppDomain. – Tom

 Смежные вопросы

  • Нет связанных вопросов^_^