Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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