Доступ к файлу, который был заблокирован сторонней библиотекой, используемой тем же процессом

Я использую стороннюю библиотеку в своем консольном приложении .NET Core. Библиотека создает текстовый файл, и библиотека держит файл заблокированным (возможно, статический экземпляр хранится где-то внутри библиотеки) до завершения процесса.

Мне нужно обработать заблокированный файл после того, как я вызову функции сторонней библиотеки. Конечно, в настоящее время я не могу этого сделать из-за печально известного исключения «Файл используется другим процессом» (в моем случае это фактически тот же процесс).

Какой самый простой и безопасный способ получить доступ к заблокированному файлу из того же консольного приложения?

К счастью, я точно знаю, что не будет запущенных параллельных потоков и другого доступа к этому файлу — как только библиотека закончит писать, это будет сделано, хотя файл останется заблокированным. Таким образом, я мог бы безопасно делать с файлом все, что захочу, если бы только я мог «сломать блокировку» или изобрести какой-нибудь трюк, чтобы выгрузить эту стороннюю библиотеку и снять блокировку.


person JustAMartin    schedule 01.09.2019    source источник
comment
Возможно, FileShare позволяет вам читать, как здесь: stackoverflow.com/questions/25097773/   -  person Frank Nielsen    schedule 01.09.2019
comment
FileShare.ReadWrite получил меня на полпути - я мог прочитать содержимое, но когда я попытался записать его обратно, я получил исключение Stream is not writable. Итак, я предполагаю, что библиотека заблокировала файл для записи.   -  person JustAMartin    schedule 01.09.2019
comment
Вы закрыли/удалили все ресурсы из библиотеки? Ненормально держать файл открытым, если только процесс не завершен полностью.   -  person Frank Nielsen    schedule 01.09.2019
comment
В документации к библиотеке предлагается инициализировать ее с помощью DI ServiceCollection. Я пытался убедиться, что мой экземпляр ServiceCollection обнуляется и выходит за рамки при попытке записи в файл, но все равно это не помогло — скорее всего, есть какие-то перекрестные ссылки.   -  person JustAMartin    schedule 01.09.2019
comment
Вы можете попробовать создать свой собственный DI Scope, затем выполнить myscope.ServiceProvider.RequiredService<T> и вызвать процесс. После этого утилизируйте область действия.   -  person Frank Nielsen    schedule 01.09.2019
comment
Спасибо, этот подход помог, но только после того, как я добавил GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); после удаления области. Я предполагаю, что некоторые ссылки все еще застряли, и только принудительная сборка мусора избавилась от них и, наконец, закрыла дескриптор файла.   -  person JustAMartin    schedule 01.09.2019