Как использовать перенаправление привязки сборки для игнорирования номеров ревизий и сборок

У меня есть несколько приложений .NET на C #, а также API для доступа к базе данных. Я хочу поместить все версии API в базу данных и попросить их выбрать самую высокую версию и номер сборки, но придерживаться старшего и младшего номеров, с которыми они были построены. Обычно, когда я ссылаюсь на API 1.2.3.4, я хочу, чтобы ссылка читалась 1.2.*.*, чтобы приложения просто принимали 1.2.3.5 Я вижу, что могу сделать это с помощью файлов конфигурации XML. Я бы предпочел, чтобы это соблюдалось. Подобно политике публикации, но без дополнительных файлов. Я мог согласиться на это. Другая проблема - все решения, которые я вижу, перенаправляют одну версию на другую конкретную версию, а не только на любую более новую версию.

Как мне это сделать?

Может ли кто-нибудь указать мне источник информации о политике издателя?


person Anthony D    schedule 22.09.2009    source источник


Ответы (2)


Благодаря предложению Леппи использования события AppDomain.AssemblyResolve , Мне удалось решить аналогичную проблему. Вот как выглядит мой код:

    public void LoadStuff(string assemblyFile)
    {
        AppDomain.CurrentDomain.AssemblyResolve += 
            new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        var assembly = Assembly.LoadFrom(assemblyFile);

        // Now load a bunch of types from the assembly...
    }

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var name = new AssemblyName(args.Name);
        if (name.Name == "FooLibrary")
        {
            return typeof(FooClass).Assembly;
        }
        return null;
    }

Это полностью игнорирует номер версии и заменяет уже загруженную библиотеку на любую ссылку на библиотеку с именем «FooLibrary». Вы можете использовать другие атрибуты класса AssemblyName, если хотите быть более строгими. FooClass может быть любым классом в сборке FooLibrary.

person Don Kirkby    schedule 26.02.2010
comment
Я пытаюсь сделать это в контексте приложения ASP.NET. Где я могу подключиться к событию AppDomain.CurrentDomain.AssemblyResolve? На уровне событий приложения (например, global.asax)? - person Mitch A; 24.02.2011
comment
Я думаю, вы сможете зарегистрироваться на мероприятие AssemblyResolve из любого места. В методе LoadStuff() нет ничего особенного. Если вы решите регистрироваться на событие каждый раз при загрузке сборки, просто не забудьте отменить регистрацию, когда закончите. - person Don Kirkby; 24.02.2011

AppDomain.AssemblyResolve событие должно помочь.

person leppie    schedule 25.09.2009