Приложение.NET не может запуститься и получить исключение XamlParseException

Я написал приложение, которое может установить и работать на моем компьютере для разработки (Windows 7).

  • Среда разработки: Windows 7, VS2010 WPF C# с установленными .NET 4 и .NET 3.5

На другом клиентском компьютере (XP SP3, 2 и 1) он устанавливается без ошибок, но не запускается. В диспетчере задач я вижу, что приложение незадолго до закрытия закрывается.

Я убедился, что.NET 3.5 согласован на моем ПК и различных клиентских машинах XP, выполнив следующие действия:

  • Приложение предназначено для .NET 3.5 (или 3.5 Client Profile)
  • Используйте установщик VS2010 для развертывания: цели .NET 3.5 в состоянии запуска
  • Никаких ошибок о совместимости.NET во время отладки приложения и проекта установщика.

Eventvwr поймал следующее предупреждение:

 ¬º˛¿‡–Õ:   ¥ÌŒÛ
 ¬º˛¿¥‘¥:   .NET Runtime
 ¬º˛÷÷¿‡:   Œfi
 ¬º˛ ID:    1026
»’∆⁄:       2011-10-18
 ¬º˛:       15:18:32
”√ªß:       N/A
º∆À„ª˙: WWW-9DB69D5A3AF
√Ë ˆ:
Application: Foo.exe
Framework Version: v4.0.30319
Description: ”…”⁄Œ¥æ≠¥¶¿Ìµƒ“Ï≥££¨Ω¯≥Ã÷’÷π°£
“Ï≥£–≈œ¢: System.Windows.Markup.XamlParseException
∂—’ª:
   ‘⁄ System.Windows.Markup.XamlReader.RewrapException(System.Exception, System.Xaml.IXamlLineInfo, System.Uri)
   ‘⁄ System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
   ‘⁄ System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
   ‘⁄ System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
   ‘⁄ System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
   ‘⁄ System.Windows.Application.LoadComponent(System.Uri, Boolean)
   ‘⁄ System.Windows.Application.DoStartup()
   ‘⁄ System.Windows.Application.<.ctor>b__1(System.Object)
   ‘⁄ System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   ‘⁄ MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   ‘⁄ System.Windows.Threading.DispatcherOperation.InvokeImpl()
   ‘⁄ System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   ‘⁄ System.Threading.ExecutionContext.runTryCode(System.Object)
   ‘⁄ System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
   ‘⁄ System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   ‘⁄ System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   ‘⁄ System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   ‘⁄ System.Windows.Threading.DispatcherOperation.Invoke()
   ‘⁄ System.Windows.Threading.Dispatcher.ProcessQueue()
   ‘⁄ System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   ‘⁄ MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   ‘⁄ MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   ‘⁄ System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   ‘⁄ MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   ‘⁄ System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   ‘⁄ MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   ‘⁄ MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   ‘⁄ System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   ‘⁄ System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   ‘⁄ System.Windows.Threading.Dispatcher.Run()
   ‘⁄ System.Windows.Application.RunDispatcher(System.Object)
   ‘⁄ System.Windows.Application.RunInternal(System.Windows.Window)
   ‘⁄ System.Windows.Application.Run(System.Windows.Window)
   ‘⁄ System.Windows.Application.Run()
   ‘⁄ FooSoftware.App.Main()


”–πÿ∏¸∂‡–≈œ¢£¨«Î≤Œ‘ƒ‘⁄ http://go.microsoft.com/fwlink/events.asp µƒ∞Ô÷˙∫Õ÷ß≥÷÷––ƒ°£

возникла исключительная ситуация XamlParseException, из-за которой мое приложение не запускалось на Windows Window Machine. Что здесь происходит?

13 ответов

Решение

XamlParseException это общая ошибка, которая возникает при возникновении проблемы при запуске приложения. Я предлагаю вам изменить код запуска вашего приложения, чтобы отслеживать, что на самом деле происходит, и получать не только исключение XamlParseException, но и внутренние исключения, которые должны помочь вам определить причину проблемы. Вот пример:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            // hook on error before app really starts
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            base.OnStartup(e);
        }

        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // put your tracing or logging code here (I put a message box as an example)
            MessageBox.Show(e.ExceptionObject.ToString());
        }
    }
}

Во-первых, вам действительно повезло бы, если бы вы работали на VS2010 ... но на самом деле нацелены на более низкую версию.Net (3.5 или даже 2.0).

Было бы определенно полезно, если вы разместите немного кода.

Убедитесь, что вы скопировали все необходимые файлы для вашего приложения (app.config и т. Д.).

Эта ссылка звучит похоже:

Программа.NET 4, написанная / скомпилированная на компьютере с Windows 7, не будет работать на XP

И это указывает на эти отличные советы по устранению неполадок:

Использование Fusion Log Viewer

Хотя вы нацеливались на.NET 3.5, ваш клиент установил и использовал.NET 4. Строка

Framework Version: v4.0.30319

говорит мне это. Чтобы заставить ваш клиент фактически использовать.NET 3.5, вы должны добавить в приложение App.config и добавить:

<configuration>
   <startup>
      <supportedRuntime version="v2.0.50727"/>
   </startup>
</configuration>

Возможно, вы получаете исключение, потому что.NET 4 обрабатывает ваш XAML по-другому. Вы пытались запустить приложение под.NET 4? Если у вас нет поставляемого App.config, вы все равно протестировали свое приложение с.NET Framework 4, хотя вы ориентировались на.NET Framework 3.5. Если ваш клиент достаточно хорош, вы можете позволить ему создать файл дампа, чтобы у вас был простой способ отладить его напрямую. Загрузите Procdump из набора инструментов SysInternals и отправьте его вместе с приложением вашему клиенту. Пусть он выполнит

procdump -ma -e -t -x foo.exe %temp%\dump.dmp

Это создаст полный дамп процесса для каждого необработанного исключения и еще один, когда процесс завершится в каталоге%TEMP%. В Visual Studio 2010 значительно улучшена поддержка анализа дампов, поэтому вы сможете анализировать его в Visual Studio 2010. Если это не поможет, вы можете загрузить Windbg (32-разрядная версия здесь), загрузите дамп и введите

! проанализировать -v

чтобы увидеть, что было последним исключением. Это должно делать свое дело. Могут быть проблемы с управляемыми расширениями для загрузки правильной отладочной библиотеки DLL (sos.dll для.NET 2,3,3.5 и clr.dll для.NET 4), но в Интернете есть множество руководств, как это сделать. Помимо этого, я бы порекомендовал добавить обработчики исключений в ваше приложение, чтобы вы получили хороший файл журнала, когда приложение неожиданно завершает работу.

Если вывод не привел к правильному стеку, вы должны использовать!ClrStack и!Threads, чтобы выяснить, какие потоки имеют исключения в своем стеке.

Вы можете удаленной отладки. В основном это делается путем установки удаленного сервера отладки на целевой машине, а затем присоединения к нему из вашей Visual Studio при запуске приложения. Дополнительную информацию можно найти здесь: http://msdn.microsoft.com/en-us/library/bt727f1t.aspx и здесь есть несколько устаревшее руководство: http://www.cprogramming.com/tutorial/visual_studio_remote_debugging.html

Обратите внимание, что вы должны выполнить развертывание с отладочными символами (pdbs), а отлаживаемое программное обеспечение должно быть в той же версии, в которой находится ваш код.

Обычно я делаю файлы журналов между процессами, чтобы я знал ход своей программы.

Если это консольное приложение, поместите Console.WriteLine(некоторая строка), а затем вы можете поставить Console.ReadLine() в конце, чтобы приостановить выполнение вашей программы.

Наткнулся на похожую проблему недавно. Проблема у меня на Windows 7, я использовал.ico (файлы значков). Но в XP их нет. В вашем приложении, если вы используете какие-либо файлы значков, попробуйте удалить их.. посмотрите, решает ли это проблему.

Строка, связанная с TryCathcWhen, заставляет меня думать о каком-то необработанном исключении при запуске, или исключение выдается в блоке catch при запуске.

Просмотр вашего кода запуска будет полезным.

Я слышал, что некоторые прокомментированные коды влияли на выходной файл выполнения на поведение, похожее на то, что происходило с вашим приложением (особенно в VS 2010, а не в другой более ранней версии), но с другой стороны, в прошлом году я работал над программой, в которой я использовал Комплект разработчика. как вы знаете, его крэк работает только в.Net Framework 3.5, а моей программной платформой была.Net Framework 4. То же самое произошло с вашим приложением, произошло из-за моего приложения. Мне пришлось понизить мою платформу до 3.5, и она работает хорошо. опыт поможет тебе чувак.

Я хочу сказать кое-что еще, это некоторые ошибки не зависят от архитектуры процессора. Не беспокойтесь об этом.

удачи. Али Форуги

Начните комментировать строки кода и целые классы / методы из вашего кода, пока вы не получите его работу (или начните с комментирования всего). Затем медленно начинайте вводить строки кода, вызовы методов и т. Д. До тех пор, пока он не сломается. Это должно дать вам представление о каком-либо конкретном коде / классе или ссылке, которая вызывает проблему. По общему признанию, это утомительный метод, но в то же время довольно механический, и в течение часа или около того у вас должно быть достаточно хорошее представление о виновнике.

У меня было приложение.Net 2.0, которое работало с отладкой, но не в версии сборки (после установки). Я не получал никаких записей из моего приложения напрямую, мои ошибки приходили прямо из.NET. Проблема заключалась в том, что я создал свой класс собственной программы со статическим void MAIN() внутри основного, который у меня был try...catch..finally блок. По какой-то причине.NET задыхался finally, У вас есть что-нибудь подобное в вашей программе?

Я видел, как это происходило на машинах, где установка.NET 3.5/4 не удалась / не была успешно завершена. Однако это также маловероятно.

Вы должны попытаться установить удаленную отладку на машине (довольно простой процесс), а затем, установив удаленную машину в качестве цели в Visual Studio, запустить программу в режиме отладки. Затем программа запустится на удаленном компьютере, и вы получите полную ошибку в Visual Studio.

Это действительно общая ошибка. В моем случае недавно установленное приложение не смогло создать собственный источник событий из-за недостаточных разрешений. Решено (безобразно), запустив приложение один раз в режиме "как администратор". Убедитесь, что все внутренние исключения обрабатываются. События также является хорошим источником информации.

Обратите внимание, что у меня было аналогичное исключение:

Application: Foo.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException
   at CommonServiceLocator.ServiceLocator.get_Current()
   at Prism.Regions.RegionManager.CreateRegion(System.Windows.DependencyObject)
   at Prism.Regions.RegionManager.OnSetRegionNameCallback(System.Windows.DependencyObject, System.Windows.DependencyPropertyChangedEventArgs)
   at System.Windows.DependencyObject.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)
   at System.Windows.FrameworkElement.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)
   at System.Windows.DependencyObject.NotifyPropertyChange(System.Windows.DependencyPropertyChangedEventArgs)
   at System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.EntryIndex, System.Windows.DependencyProperty, System.Windows.PropertyMetadata, System.Windows.EffectiveValueEntry, System.Windows.EffectiveValueEntry ByRef, Boolean, Boolean, System.Windows.OperationType)
   at System.Windows.DependencyObject.SetValueCommon(System.Windows.DependencyProperty, System.Object, System.Windows.PropertyMetadata, Boolean, Boolean, System.Windows.OperationType, Boolean)
   at System.Windows.Baml2006.WpfMemberInvoker.SetValue(System.Object, System.Object)
   at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(System.Xaml.XamlMember, System.Object, System.Object)
   at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(System.Object, System.Xaml.XamlMember, System.Object)

Exception Info: System.Windows.Markup.XamlParseException
   at System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
   at System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
   at System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
   at System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
   at System.Windows.Application.LoadComponent(System.Uri, Boolean)
   at System.Windows.Application.DoStartup()
   at System.Windows.Application.<.ctor>b__1_0(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Application.RunDispatcher(System.Object)
   at System.Windows.Application.RunInternal(System.Windows.Window)
   at System.Windows.Application.Run(System.Windows.Window)
   at System.Windows.Application.Run()
   at Foo.App.Main()

Ключевой частью в моем случае выше было CommonServiceLocator.ServiceLocator.get_Current(). Мое приложение не использовалоServiceLocatorкуда угодно; однако похоже, что он использовался установленным мной пакетом NuGet.

Я решил проблему, выполнив это в консоли NuGet Package Manage для моего основного проекта приложения:

PM> Install-Package CommonServiceLocator -Version 2.0.5

В моем случае проблема решалась, когда пользователь устанавливал ту же версию.Net FW, для которой я разрабатывал. (У меня есть FW 4.5.1, а у пользователя FW 4.0).

Итак, проверьте версию FW:

http://msdn.microsoft.com/library/hh925568(v=vs.110).aspx

И установить точно так же, прежде чем пытаться снова выполнить

Другие вопросы по тегам