Использование AppDomain в C # для динамической загрузки и выгрузки DLL - PullRequest
6 голосов
/ 05 июля 2011

В одном из моих приложений, связанных с диагностикой системы, соответствующая DLL должна динамически загружаться и выгружаться в C #. После некоторого поиска я обнаружил, что отдельная DLL не может быть загружена динамически, это полный AppDomain. Поэтому я должен создать AppDomain и использовать эту DLL для динамической загрузки и выгрузки. Но я нигде не мог найти, как я могу использовать это в коде. Я не могу показать код приложения, поскольку он противоречит правилам компании.

Может кто-нибудь сказать мне код приложения, чтобы использовать его. Я хочу динамически загружать и выгружать dll, используя appdomain и вызывать определенный метод в этой dll, dll не имеет никакой точки входа.

Спасибо за ответы. Ashutosh

Ответы [ 4 ]

13 голосов
/ 05 июля 2011

Как: загрузить сборки в домен приложения

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);
    }

Что касается того, как выгрузить его, вы должны выгрузить сам домен приложения, см. this

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);
}
1 голос
/ 05 июля 2011

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

Однако, как следует из его названия, у вас есть новый домен приложения, и вы не можете просто вызвать его код и использовать его типы, которые вам нужны для маршалинга ваших вызовов и данных через границы домена. Если вы ищете, вы найдете множество примеров, как это сделать.

Что следует учитывать, так это то, что это общий шаблон, и для него есть готовые решения, сама среда имеет целое пространство имен надстроек, которое предназначено для этого типа поведения плагинов, это может стоить вашего в то время как в ближайшем рассмотрении этого в первую очередь. Здесь есть статья , в которой показано, как ее использовать.

1 голос
/ 05 июля 2011

Трудно понять ваш вопрос, но я постараюсь внести некоторые предложения.

Нет причины, по которой вы не можете динамически загружать dll напрямую в ваше приложение без отдельного домена приложения, хитрость в том, что вы не можете его выгрузить. Это важно только в том случае, если вы можете загрузить несколько версий одной и той же библиотеки DLL (т. Е. Вы хотите иметь возможность обновить этот диагностический компонент до новой версии без остановки выполнения вашего приложения). Если это то, что вы пытаетесь сделать, тогда я предлагаю эту статью CodeProject .

0 голосов
/ 19 июля 2011

Спасибо, ребята, вот ссылка, где я нашел ответ на мой вопрос:

Описание форума MSDN для динамической загрузки и выгрузки сборок

Другая dll может быть динамически загружена и выгружена с использованием другого класса, который загружает сборку и вызывает методы в этой сборке ... AppDomain.CreateInstanceAndUnwrap обычно требует ввода в виде сборок из текущего проекта или вообще текущего пространства имен. чтобы решить, что мне нужно Assembly.LoadFrom (); для использования в каком-либо другом классе, создания AppDomain и создания экземпляра этого класса с использованием объекта AppDomain, как указано в ссылке.

Спасибо за ваши ответы, ребята.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...