Подтвердить что ты не робот

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

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

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

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

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

  • Приложение нацелено на .NET 3.5 (или 3.5 Профиль клиента)
  • Используйте установщик 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, заставившее мое приложение не запускаться на XP Window Machine. Что происходит?

4b9b3361

Ответ 1

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());
        }
    }
}

Ответ 2

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

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

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

Эта ссылка похожа:

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Обратите внимание, что ваш код запуска будет полезен.

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

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

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