Мой сценарий выглядит следующим образом:
- Создать новый AppDomain
- Загрузите в него некоторые сборки
- Сделайте некоторые магии с загруженными dll
- Выгрузить AppDomain для освобождения памяти и загруженных библиотек.
Ниже приведен код, который я пытаюсь использовать
class Program
{
static void Main(string[] args)
{
Evidence e = new Evidence(AppDomain.CurrentDomain.Evidence);
AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
Console.WriteLine("Creating new AppDomain");
AppDomain newDomain = AppDomain.CreateDomain("newDomain", e, setup);
string fullName = Assembly.GetExecutingAssembly().FullName;
Type loaderType = typeof(AssemblyLoader);
var loader = (AssemblyLoader)newDomain.CreateInstanceFrom(loaderType.Assembly.Location, loaderType.FullName).Unwrap();
Console.WriteLine("Loading assembly");
Assembly asm = loader.LoadAssembly("library.dll");
Console.WriteLine("Creating instance of Class1");
object instance = Activator.CreateInstance(asm.GetTypes()[0]);
Console.WriteLine("Created object is of type {0}", instance.GetType());
Console.ReadLine();
Console.WriteLine("Unloading AppDomain");
instance = null;
AppDomain.Unload(newDomain);
Console.WriteLine("New Domain unloaded");
Console.ReadLine();
}
public class AssemblyLoader : MarshalByRefObject
{
public Assembly LoadAssembly(string path)
{
return Assembly.LoadFile(path);
}
}
}
library.dll состоит только из одного фиктивного класса с одной огромной таблицей строк (для более легкого отслеживания потребления памяти)
Теперь проблема в том, что память на самом деле не освобождена. Что еще более удивительно, использование памяти фактически увеличивается после AppDomain.Unload()
Может кто-нибудь пролить свет на эту проблему?