Как использовать перенаправление привязки сборки, чтобы игнорировать номера ревизии и сборки - PullRequest
12 голосов
/ 22 сентября 2009

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

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

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

Ответы [ 2 ]

27 голосов
/ 26 февраля 2010

Благодаря предложению Леппи об использовании события 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.

5 голосов
/ 25 сентября 2009

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

...