Visual Studio сохраняет дескриптор папки, открытой во время сеанса отладки - PullRequest
0 голосов
/ 01 октября 2018

Мое приложение открывает файл XML в папке для десериализации его содержимого.Я освобождаю все, но devenv все еще держит ручку на содержащей папке.Проблема в том, что я открываю сторонние программы как дочерние процессы, и их выполнение не будет выполнено, так как они жалуются на невозможность удалить папку.

Это код, который я использую в своем приложении для открытия файла идесериализовать содержимое XML:

XmlConfig result = null;
XmlSerializer serializer = new XmlSerializer(typeof(XmlConfig));

using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    using (StreamReader sr = new StreamReader(fs))
    {
        result = (XmlConfig)serializer.Deserialize(sr);
    }
}

return result;

Раньше я не использовал FileStream, а только StreamReader, но результат был таким же.

Ошибка возникает, если:

  • Я запускаю сеанс отладки из Visual Studio
  • Я запускаю приложение из выходной папки и подключаю отладчик перед запуском кода выше
  • Я запускаюприложение из выходной папки и не присоединяйте отладчик, но ошибка произошла до

Ошибка не возникает, если:

  • Я запускаю приложение изВыходная папка без подключения отладчика
  • Я запускаю приложение из выходной папки и подключаю отладчик после выполнения кода выше

Я работаю VS Professional 2017 15.8.4.как администратор (поскольку приложение должно запускаться с правами администратора). Это проект WPF, .Net версии 4.6.

Все, что я смог найти в этой теме, - это невозможность сборки из-за блокировки Visual Studio некоторых DLLфайл в папке bin или obj.Это не соответствует моей проблеме.

Что здесь происходит и что важнее: как я могу решить эту проблему?

Редактировать:

Вот сообщение об ошибке, которое я получаю от моего дочернего процесса:

devenx.exe   pid: 8612   type: file   1388: C:\lockedfolder

Я также проверил это с помощью Unlocker :

unlocker showing the folder is locked by devenv.exe

1 Ответ

0 голосов
/ 01 октября 2018

Итак, как меня попросили, я сформулирую свой комментарий в качестве ответа.Большой отказ от ответственности: эта проблема сама по себе остается для меня загадкой, так как я не мог всеми силами воспроизвести ее в любой форме.

Я собрал небольшую тестовую программу:

Пример

class Program
{
    public static string filepath = "test.xml";

    static void Main(string[] args)
    {
        Serialize();

        Console.WriteLine(Deserialize().Test);

        Console.ReadKey(true);
    }

    private static XmlConfig Deserialize()
    {
        XmlConfig result = null;
        XmlSerializer serializer = new XmlSerializer(typeof(XmlConfig));

        using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            using (StreamReader sr = new StreamReader(fs))
            {
                result = (XmlConfig)serializer.Deserialize(sr);
            }
        }

        return result;
    }

    private static void Serialize()
    {
        using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(XmlConfig));
            serializer.Serialize(fs, new XmlConfig());
        }
    }
}

public class XmlConfig
{
    public string Test { get; set; } = "Teststring";
}

Это не должно работать, если проблема была в коде.Но все прошло нормально, без проблем.Отладка / выпуск, с / без подключенного отладчика, VS как администратор / не администратор.

Советы

Итак, вот мои советы, которые, казалось, помогли решить вопрос, который я всегда рекомендую попробовать при работес потоками / сериализацией:

  • Несмотря на то, что потоки типа FileStream реализуют IDisposable и должны сбрасывать + закрывать поток при использовании в using -блоке, попробуйте вручную сбросить и илизакрой их.Иногда это может помочь (особенно при работе с COM-портами)

  • Всегда старайтесь ограничивать локальные переменные до минимально возможной области (т. Е. Перемещать инициализацию Serializer внутри нужного вам использования).

  • Меньше конфигурации> больше конфигурации, которая максимально уменьшает сложность (для этого сравните Serialize() и Deserialize() в моем примере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...