XElement.Загрузить собственное исключение в .NET CF Windows CE 5.0

#.net #compact-framework #windows-ce

#.net #compact-framework #windows-ce

Вопрос:

Я работаю C#.NET CF 3.5 в Windows CE 5.0, и возникает другая проблема. в моем приложении я загружаю / сохраняю некоторые данные из / в XML-файл в качестве конфигурации, используя класс ‘XElement’. у меня есть статические методы с именами ‘Load’ и ‘Save’, которые получают ключ и строковое значение для загрузки и сохранения. это работает нормально. но когда я вызываю метод my Save более 4 раз, я получаю встроенную ошибку. похоже, что ранее загруженные документы XElement должны быть удалены или что-то в этом роде. но как? или в чем дело? мой метод сохранения :

 private static void Save(string keyName,string Value)
{
    string strConfigFilePath = CheckConfigFileExistence(); // checks file existence and returns only the file name

    XElement xeDoc = XElement.Load(strConfigFilePath); // HERE! throws a native exception at 4th method call! 
    XElement xeAppSettings = xeDoc.Element("appSettings"); // find 'appSettings' section
    XElement xKey = xeAppSettings.Elements("add").Where(el => el.Attribute("key").Value == keyName).FirstOrDefault(); // find the desired key

    xKey.Attribute("value").Value = Value;
    xeDoc.Save(strConfigFilePath);
}
  

Комментарии:

1. пожалуйста, укажите сообщение об исключении, это может помочь

2. В этом коде нет явной утечки. Пожалуйста, опубликуйте сведения об исключении и, возможно, также проверьте Configfileexistence().

3. @Waleed, @Henk , в этой версии моего приложения метод ‘CheckConfigFileExistence()’ не делает ничего, кроме объединения некоторых строк и создания полного пути к файлу и имени. и я не могу поместить исключение здесь, потому что я не могу перехватить собственные исключения с помощью ‘try / catch’. я могу только сказать, что код ошибки ‘0xc0000005’, а модуль сбоя ‘mscoree3_5.dll ‘ и это говорит что-то о fastAllocatingString…

4. вызывается ли ваш метод сохранения из двух потоков одновременно, возможно, проблема в том, что последняя операция xeDoc.Save() не была завершена, файл заблокирован для блокировки записи и загрузки его с помощью XElement. Загрузка вызвала бы эту проблему, довольно странное поведение!

5. @Waleed, нет, это всего лишь одна тема. позвольте мне рассказать вам новость. я удалил ключевое слово ‘static’ из объявления метода ‘Save’ и снова протестировал некоторые ключи, и это сработало. я думаю, я должен сделать свой код более безопасным и нормальным, чтобы избежать этих необработанных исключений. я боюсь, потому что я не нашел причину проблемы, я просто поработал вокруг! возможно, позже возникнут еще какие-нибудь ужасные ошибки!

Ответ №1:

Благодаря Валиду и Хенку Холтерманам, исходя из моего опыта, собственное исключение с собственным кодом ошибки 0x00000005 возникает по некоторым причинам утечки памяти при работе с неуправляемыми кодами и собственными библиотеками DLL. я столкнулся с такой же ошибкой во многих других точках. в моем проекте я вызвал некоторые собственные функции DLL, записывающие параметры ввода / вывода, такие как byte[] и * BYTE и т.д. я думаю, что любая ошибка и неточность при записи в память с помощью неуправляемого кода и кодов C приводит к тому, что исключения позже в нерелевантных точках управляемого кода!

надеюсь, это будет полезно.