#c# #silverlight #windows-phone-7
#c# #silverlight #windows-phone-7
Вопрос:
У меня есть приложение Silverlight для Windows Phone 7. Это приложение работает нормально, за исключением случаев, когда пользователь откладывает приложение в долгий ящик и пытается повторно активировать его. Когда они пытаются отреагировать на приложение, я получаю исключение NullReferenceException, когда я запускаю приложение с одной конкретной страницы. Моя проблема в том, что я ни за что на свете не смогу определить действительную причину этого исключения.
Кто-нибудь знает какие-нибудь хорошие бесплатные инструменты, которые помогли бы мне изучить потенциальную причину? Или у кого-нибудь есть какой-либо способ определить причину. Трассировка стека не помогает, поскольку она выглядит следующим образом, но не определяет, где проблема в моем коде:
at System.Runtime.Serialization.XmlFormatReader.StoreCollectionValue(Objectamp; collection, Object value, CollectionDataContract collectionContract)
at System.Runtime.Serialization.XmlFormatReader.LoadValueOfCollection(DeserializedObject desObj, Object value, Int32 membersRead, Type itemType)
at System.Runtime.Serialization.XmlFormatReader.ReadGetOnlyCollectionItem(DeserializedObject desObj, CollectionDataContract collectionContract, Int32 membersRead)
at System.Runtime.Serialization.XmlFormatReader.ReadGetOnlyCollection(DeserializedObject desObj, CollectionDataContract collectionContract, Int32 membersRead)
at System.Runtime.Serialization.XmlFormatReader.Deserialize(XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlFormatReader.InitializeCallStack(DataContract clContract, XmlReaderDelegator xmlReaderDelegator, XmlObjectSerializerReadContext xmlObjContext, XmlDictionaryString[] memberNamesColl, XmlDictionaryString[] memberNamespacesColl)
at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContractamp; dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream)
at Microsoft.Phone.Shell.StreamPersister.Deserialize(Byte[] blob, IEnumerable`1 knownTypes, IDictionary`2amp; dictionary)
at Microsoft.Phone.Shell.StreamPersister.Load(ShellPageManager shellPageManager, String key, IEnumerable`1 knownTypes, IDictionary`2amp; dictionary)
at Microsoft.Phone.Shell.PhoneApplicationService.FireActivated()
at Microsoft.Phone.Execution.NativeEmInterop.FireOnResume()
Похоже, это какая-то проблема с сериализацией. Однако я не знаю, что могло бы вызвать проблему. Спасибо!
Комментарии:
1. Возможно, вы используете ApplicationSettings для своего надгробия?
2. Если вы зайдете в VS2010 в раздел Debug > Exceptions и проверите, когда произойдет сбой . Возникают СЕТЕВЫЕ исключения, вы не можете найти фактический источник, который выдает ошибку?
3. Это действительно странно. Я создал совершенно новую страницу, и я получаю исключение NullReferenceException на странице при возвращении из Tombstoning.
Ответ №1:
Сегодня утром у меня была такая же проблема. Моя проблема была связана с использованием базового массива. Я изменил массив на ObservableCollection
, и это сработало. Я подробно описал проблему с кодом в этом блоге.
Ответ №2:
Попробуйте выполнить отладку с точкой останова в обработчике событий Application_Activated. Что-то может быть нулевым при повторной активации приложения:
private void Application_Activated(object sender, ActivatedEventArgs e)
{
//insert a breakpoint here
Комментарии:
1. Тело моего обработчика событий Application_Activated пустое. Итак, я поместил в него поле для сообщений, просто чтобы напечатать «Привет». Как ни странно, окно сообщения никогда не появляется.
Ответ №3:
Если вы подозреваете проблему с сериализацией, вы можете легко проверить содержимое загруженных данных, например
using (var fs = isoStore.OpenFile(StoragePath, System.IO.FileMode.Open))
{
StreamReader sr = new StreamReader(fs);
string content = sr.ReadToEnd();
// Put a break point here and show content variable in Xml Visualizer.
// Can be done from Locals Debug window for example.
}
Но я бы начал с проверки логики вашего приложения. Скорее всего, что-то, что еще не было инициализировано. Должно быть легко найдено в отладчике.
Комментарии:
1. Что такое StoragePath? Где установлена эта переменная?