Как переключить сборку.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".
Вы должны иметь возможность указать псевдоним для двух версий сборки и использовать одинаковые префиксы в своем коде.