2015-04-16 3 views
2

Я пытаюсь загрузить сборку, используйте Reflection, чтобы получить весь класс 'внутри этого .dll, а затем удалить .dll. Однако при попытке удалить .dll я получаю отказ в доступе. Это связано не с правами доступа, поскольку я могу удалить .dll, если я не загружаю его первым.Как выгрузить загруженную сборку

Я смотрел MSDN, и, видимо, нет возможности «разгрузить», но я надеюсь, что может быть и другой способ.

Assembly assembly; 
assembly = Assembly.LoadFrom(filepath); 

Type[] listOfAllClassInDll = assembly.GetTypes(); 
List<string> listOfAllClassNamesInDll = new List<string>(); 

     foreach (Type classInDll in listOfAllClassInDll) 
     { 
      listOfAllClassNamesInDll.Add(classInDll.Name); 
     } 

File.Delete(filepath); 
+1

См http://stackoverflow.com/questions/225330/how-to-load-a-net-assembly -for-reflection-operations-and-then-unload-it или использовать Mono.Cecil – xanatos

+0

@xanatos Кажется, что ни один из моих классов не может быть загружен с помощью ReflectionOnlyLoadFrom, все они бросают «ReflectionTypeLoadException». Не уверен, что это проблема, с которой я могу обойти некоторые способы. – Ralt

+0

В общем случае вам придется загрузить их в другой AppDomain, если вы хотите их выгрузить. «Неплохо» загружать сборки, а затем просто выгружать их. Они могут делать «вещи» при загрузке. По этой причине существует 'ReflectionOnlyLoadFrom'. Я предлагаю вам попробовать «Mono.Cecil» – xanatos

ответ

1

На самом деле вы не можете сделать это просто .. Существует почему: http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx

Но вы можете динамически загрузить сборку в другой AppDomain. Тогда, когда вам не нужна ваша сборка, вы должны выгрузить приложение AppDomain с загруженной сборкой.

Пример есть: https://bookie.io/bmark/readable/9503538d6bab80

0

Вместо использования LoadFrom/LoadFile вы можете использовать нагрузки с File.ReadAllBytes. Здесь вы не используете файл сборки напрямую, но читаете его содержимое и используете прочитанные данные. Таким образом, вы можете переименовать/удалить файл.

Ваш код будет выглядеть следующим образом:

Assembly assembly; 
assembly = Assembly.Load(File.ReadAllBytes(filepath)); 

Type[] listOfAllClassInDll = assembly.GetTypes(); 
List<string> listOfAllClassNamesInDll = new List<string>(); 

foreach (Type classInDll in listOfAllClassInDll) 
{ 
    listOfAllClassNamesInDll.Add(classInDll.Name); 
} 

File.Delete(filepath); 

Надеется, что это помогает :)

Смежные вопросы