#.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 приводит к тому, что исключения позже в нерелевантных точках управляемого кода!
надеюсь, это будет полезно.