AppDomain.Unload утечка памяти - PullRequest
       4

AppDomain.Unload утечка памяти

0 голосов
/ 23 декабря 2011

У меня в AppDomain проблема, аналогичная описанной в этом посте

http://social.msdn.microsoft.com/Forums/en-AU/clr/thread/20de15d6-3111-4c2e-a04b-feb341a67ebc

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

{
    AppDomain domain2 = AppDomain.CreateDomain("ADFHelper");  
    obj = domain2.CreateInstanceAndUnwrap ("Econ.Test", "Econ.Test.ADFHelper"); 
    object results = obj.GetType().InvokeMember("DoADFTest",System.Reflection.BindingFlags.InvokeMethod, Type.DefaultBinder, obj, new object[] {     ResArray.ToArray() }); 
    AppDomain.Unload(domain2);
}

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Код в потоке неправильно использовал AppDomain.Load, чтобы попытаться загрузить сборку в новом домене. На самом деле это было по существу загрузить сборку в текущий домен. Как указано в документации MSDN (выделение добавлено):

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

Решение как описано в этой документации - используйте что-то вроде AppDomain.CreateInstanceAndUnwrap для загрузки класса в новом домене приложения. Это был бы правильный подход, если загружаемый класс имеет класс MarshalByRefObject и вам необходимо вызывать методы изнутри текущего домена приложения.

Если вы не хотите MarshalByRefObject и вам не нужно трогать только что загруженный класс (т.е. вы просто хотите, чтобы тип загружался и «оставался один» в новом домене приложения), вы можете сделать вместо AppDomain.CreateInstance, который не требует сортировки или удаленного взаимодействия.

0 голосов
/ 23 декабря 2011

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

В принципе, если вы загружаете сборку в другой домен приложений, она также будет загружена втекущий AppDomain - это необходимо, чтобы иметь возможность доступа к типам в нем и, таким образом, что-то делать с ним.Поэтому в AppDomain.Unload () сборка будет по-прежнему загружаться в вызывающий AppDomain.

Вы можете обойти это, используя метод AppDomain.CreateInstanceFrom, как описано в http://msdn.microsoft.com/en-us/library/2xkww633%28v=VS.90%29.aspx,, поэтому у вас есть 2 способа:избежать проблемы:

  • Использовать отражение
  • Использовать интерфейс для доступа к новому объекту в другом домене приложений - этот интерфейс должен быть известен обоим доменам приложений, обычно этого можно достичь, загрузивнебольшая сборка, содержащая интерфейс, в обоих доменах приложений.
...