Подменить DLL
Как в C# подменить уже подгруженную DLL новой?
Дело вот какое.
К моей программе подгружена DLL, однако в ходе работы программы я формирую динамичный код для этой DLL, после чего она перегенерируется и, по идее, должна снова "подцепиться" к программе. Но этого не происходит, так как моя программа блокирует саму возможность создать новую DLL.
Как отцепить и подцепить обратно?
Конкретней вот так делаю
var domain = AppDomain.CreateDomain(Path.GetFileName(filename)); var reader = new FileStream(filename, FileMode.Open, FileAccess.Read); var b = new byte[reader.Length]; reader.Read(b, 0, (int) reader.Length); reader.Close(); var assembly = domain.Load(b);
То есть создаю перед вызовами из библиотеки свой AppDomain, в него подгружаю Dll
Потом выгружаю AppDomain когда заканчиваю с ним работать:
AppDomain.Unload(domain);
Но файл все равно занят процессом, пробил что он любит цепляться к AppDomain.currentDomain при вызове appDomain.Load() на любом другом домене.
Читал советы за юзание CreateInstanceAndUnwrap, но нормально связать c dll нифига не выходит, до утра прямо сидел перебирал разные способы.
В общем пока что сделал так - генерю новые dll с префиксом 'temp-' и случайным GUID'ом. Но они копятся в папке дай бог. Хотя бы перед закрытием программы как-то их удалить :(
Есть предложения?
Ответ
Можно пробовать удалять старые копии при новом запуске программы, а не текущие при закрытии.
Смотрите также:
Комментарии
Можно пробовать удалять старые копии при новом запуске программы, а не текущие при закрытии.
Ну, это такое, пока что в принципе так и сделаю наверное. Если мне не дадут совет как-таки удалить.
Возможность добавлять комментарии была ограничена
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]