Как переключить сборку.NET для выполнения одного метода?

У меня есть разные версии DLL для моего приложения.NET, и большую часть времени я хочу использовать самую последнюю. Тем не менее, есть один метод, который я запускаю в отдельном потоке, где мне нужно иметь возможность выбрать более старую версию DLL на основе некоторых критериев.

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

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

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

Большое спасибо;)

3 ответа

Решение

Попробуйте что-то вроде этого:

class Program
{
    static void Main(string[] args)
    {
        System.Type activator = typeof(ApplicationProxy);
        AppDomain domain = 
            AppDomain.CreateDomain(
                "friendly name", null,
                new AppDomainSetup()
                {
                    ApplicationName = "application name"
                });

        ApplicationProxy proxy = 
            domain.CreateInstanceAndUnwrap(
                Assembly.GetAssembly(activator).FullName,
                activator.ToString()) as ApplicationProxy;

        proxy.DoSomething();

        AppDomain.Unload(domain);
    }
}

И создать прокси-класс (должен наследовать от MarshalByRefObject)

class ApplicationProxy : MarshalByRefObject
{
    public void DoSomething()
    {
        Assembly oldVersion = Assembly.Load(new AssemblyName()
        {
            CodeBase = @"c:\yourfullpath\AssemblyFile.dll"
        });

        Type yourOldClass = oldVersion.GetType("namespace.class");
        // this is an example: your need to correctly define parameters below
        yourOldClass.InvokeMember("OldMethod", 
                                   BindingFlags.Public, null, null, null);
    }
}

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

public void MyNewMethod(){}

public void MyLegacyMethod(){}

Возможно, вы могли бы использовать внешний псевдоним, посмотреть, что такое "свойство-это-псевдонимы-свойство-сборки-ссылки-в-визуальном-студии-8".

Вы должны иметь возможность указать псевдоним для двух версий сборки и использовать одинаковые префиксы в своем коде.

Другие вопросы по тегам