Использование AppDomain в C# для динамической загрузки и выгрузки DLL
В одном из моих приложений, которое связано с диагностикой системы, соответствующая DLL должна динамически загружаться и выгружаться в C#. После некоторого поиска я обнаружил, что отдельная DLL не может быть загружена динамически, это полный AppDomain. Поэтому я должен создать AppDomain и использовать эту DLL для динамической загрузки и выгрузки. Но я нигде не мог найти, как я могу использовать это в коде. Я не могу показать код приложения, так как это противоречит правилам компании.
Может кто-нибудь сказать мне код приложения, чтобы использовать его. Я хочу динамически загружать и выгружать dll, используя appdomain и вызывать определенный метод в этой dll, dll не имеет никакой точки входа.
Спасибо за ответы. Ashutosh
4 ответа
Спасибо, ребята, вот ссылка, где я нашел ответ на мой вопрос:
Описание форума MSDN для динамической загрузки и выгрузки сборок
Другая dll может быть динамически загружена и выгружена с использованием другого класса, который загружает сборку и и вызывает методы в этой сборке... AppDomain.CreateInstanceAndUnwrap обычно требует ввода в виде сборок из текущего проекта или, как правило, текущего пространства имен. чтобы решить, что мне нужно Assembly.LoadFrom(); для использования в каком-либо другом классе, создания AppDomain и создания экземпляра этого класса с использованием объекта AppDomain, как указано в ссылке.
Спасибо за ваши ответы, ребята.
Как загрузить сборки в домен приложения
public static void Main()
{
// Use the file name to load the assembly into the current
// application domain.
Assembly a = Assembly.Load("example");
// Get the type to use.
Type myType = a.GetType("Example");
// Get the method to call.
MethodInfo myMethod = myType.GetMethod("MethodA");
// Create an instance.
object obj = Activator.CreateInstance(myType);
// Execute the method.
myMethod.Invoke(obj, null);
}
Что касается того, как выгрузить его, вы должны выгрузить сам AppDomain, посмотрите это
AppDomain Temporary = AppDomain.CreateDomain("Temporary");
try
{
Gateway Proxy =
(Gateway) Temporary.CreateInstanceAndUnwrap("Shim", "Shim.Gateway");
Match M = Proxy.LoadAndMatch("Plugin.dll",
"Though the tough cough and hiccough, plough them through");
}
finally
{
AppDomain.Unload(Temporary);
}
На самом деле вы можете динамически загружать сборки в свой домен приложения и запускать код из него, проблема в том, что вы не можете выгрузить сборку. Однако вы можете загрузить дополнительные домены приложений (и сборки в них) и выгрузить домен приложений, когда закончите.
Однако, как следует из его названия, у вас есть новый домен приложения, и вы не можете просто вызвать его код и использовать его типы, которые вам нужны для распределения ваших вызовов и данных через границы домена. Если вы ищете, вы найдете много примеров того, как это сделать.
Однако следует учесть, что это общий шаблон, и для него есть готовые решения, сама среда имеет целое пространство имен надстроек, которое предназначено для этого типа поведения плагинов. Возможно, вам стоит иметь внимательно посмотреть на это в первую очередь. Здесь есть статья, которая показывает, как ее использовать.
Трудно понять ваш вопрос, но я постараюсь внести некоторые предложения.
Нет причины, по которой вы не можете динамически загружать dll напрямую в ваше приложение без отдельного домена приложения, а хитрость в том, что вы не можете его выгрузить. Это важно только в том случае, если вы можете загрузить несколько версий одной и той же библиотеки DLL (т. Е. Вам нужна возможность обновить этот диагностический компонент до новой версии, не останавливая выполнение вашего приложения). Если это то, что вы пытаетесь сделать, то я предлагаю эту статью CodeProject.