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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 20 января 2010

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

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);
    }
}
0 голосов
/ 20 января 2010

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

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

0 голосов
/ 20 января 2010

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

public void MyNewMethod(){}

public void MyLegacyMethod(){}
...