Использование 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.

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