Удалить DLL после закрытия c# приложения - PullRequest
1 голос
/ 27 февраля 2020

У меня есть c# приложение, которое включает в себя различные внешние библиотеки DLL. При запуске приложения dll извлекаются в папке .exe, чтобы обеспечить правильное выполнение. здесь код:

var executingAssembly = Assembly.GetExecutingAssembly();

string folderName = string.Format("{0}.Resources.DLLs", executingAssembly.GetName().Name);
var list = executingAssembly
.GetManifestResourceNames()
.ToArray();
foreach (var item in list)
{
    File.WriteAllBytes(item.Replace("myapp.DLLs.", ""), 
    ReadAllBytes(executingAssembly.GetManifestResourceStream(item)));
}

когда я закрываю форму, я хочу удалить эти файлы с этим кодом, связанным с событием закрытия формы:

private void CleanFiles(Object sender, FormClosingEventArgs e)
{
    var executingAssembly = Assembly.GetExecutingAssembly();
    string folderName = string.Format("{0}.Resources.DLLs", executingAssembly.GetName().Name);
    string folder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    var list = executingAssembly
    .GetManifestResourceNames()
    .ToArray();
    foreach (var item in list)
    {

        File.Delete(folder + @"\" + item.Replace("myapp.DLLs.", ""));
    }
}

Если я открою, а затем закройте форму, она работает отлично. Но если я открою форму, сделаю несколько операций, она выдаст исключение во время операций закрытия, потому что доступ к dll запрещен. Как я могу освободить все библиотеки / ресурсы?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я предполагаю, что если вы копируете эти библиотеки DLL, вы загружаете и используете их впоследствии.

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

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

Что-то вроде:

var dynamicDomain = AppDomain.CreateDomain("YourDomainName");
var dynamicallyLoadedAssembly = dynamicDomain.Load("YourAssembly");

// do stuff with your dynamically loaded assembly

AppDomain.Unload(dynamicDomain);

Для получения дополнительной информации о topi c: MSDN "Как: загружать и выгружать сборки" .

0 голосов
/ 27 февраля 2020

Вы можете (и должны) реализовывать обработку исключений вокруг частей, где вы управляете файлами в системе:

try
{
  // Manipulate your files here.
}
catch (Exception ex)
{
  // Handle exceptions here. you can also delete the dlls here if you wish.
  // Remember to check in CleanFiles if the files are already deleted.
}
finally
{
  // You could also get rid of the files here.
  // Finally-block is executed regardless if an exception was thrown or not.
}

Полезные ссылки: Microsoft: обработка исключений , Microsoft : Лучшие решения для исключений

...