Событие AppDomain, вызываемое для разрешения сборки *ATTEMPTED*

Есть ли событие, к которому мы можем подключиться, которое вызывается ДО сборки.

Например, если какой-то код в AppDomain вызывает Assembly.Load(path) , будет вызвано событие, сообщающее о попытке загрузки этой сборки?

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

Выполнение этого также из конфигурации является допустимым вариантом, если это возможно.

Какие-либо предложения ?


person lysergic-acid    schedule 10.07.2011    source источник


Ответы (2)


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

public static class AssemblyLoader
{
    public delegate void LoadDelegate(string path);

    public void LoadAssembly(string path)
    {
        if(OnPreLoad != null)
            OnPreLoad(path);
        // load assembly here
    }  // eo LoadAssembly

    public event LoadDelegate OnPreLoad;
} // eo AssemblyLoader

Затем вы можете использовать этот метод в любом месте кода, когда хотите загрузить сборку.

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

person Moo-Juice    schedule 10.07.2011
comment
У меня проблема в том, что код загрузки сборки написан не мной (третьей стороной). Этот код использует жестко заданное местоположение для разрешения плагинов. Я хотел бы перехватить этот процесс и иметь возможность указать свое собственное местоположение, поскольку это вызывает проблемы с распространением моего приложения, которое использует эту третью сторону. - person lysergic-acid; 10.07.2011
comment
@liortal, ах, я задавался этим вопросом - действительно, этот метод не будет работать, если вы не контролируете процесс загрузки сборок. - person Moo-Juice; 10.07.2011

Нет, такого события нет. Одним из возможных способов взлома является преднамеренная неправильная настройка свойства AppDomainSetup.ApplicationBase, чтобы CLR никогда не могла найти ни одну из сборок. В этом случае будет запущено событие AppDomain.AssemblyResolve, что позволит вам реализовать собственную схему разрешения сборки.

person Hans Passant    schedule 10.07.2011