Приложение .NET не может запуститься и получить исключение XamlParseException - PullRequest
33 голосов
/ 18 октября 2011

Я написал приложение, которое может устанавливать и работать на моем ПК для разработки (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 Профиль клиента )
  • Использовать установщик VS2010 для развертывания: цели .NET 3.5 inУсловие запуска
  • Нет ошибок в отношении совместимости .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 ]

83 голосов
/ 22 октября 2011

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());
        }
    }
}
7 голосов
/ 18 октября 2011

Для начала вам действительно повезло бы, если бы вы работали на VS2010 ... но на самом деле нацелен на для более низкой версии .Net (3.5 или даже 2.0).

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

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

Эта ссылка звучит примерно так:

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

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

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

6 голосов
/ 26 октября 2011

Хотя вы ориентировались на .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 а также !Потоки чтобы выяснить, какие потоки имеют исключения в стеке.

6 голосов
/ 21 октября 2011

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

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

5 голосов
/ 18 октября 2011

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

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

4 голосов
/ 20 октября 2011

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

3 голосов
/ 25 октября 2011

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

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

3 голосов
/ 18 октября 2011

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

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

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

3 голосов
/ 18 октября 2011

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

1 голос
/ 27 октября 2011

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

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