.NET应用程序无法启动和接收XamlParseException

时间:2011-10-18 03:41:45

标签: c# wpf deployment

我写了一个可以在我的开发PC(Window 7)上安装和工作的应用程序。

  • 开发环境:Window 7,VS2010 WPF C#同时安装了 .NET 4 .NET 3.5

在其他客户端计算机(XP SP3,2和1)上,安装时没有错误,但无法启动。在任务管理器中,我可以看到应用程序在关闭之前会短暂占用内存。

我通过以下方式确保了我在开发PC和各种客户端XP机器上的.NET 3.5一致性:

  • 该应用程序的目标是 .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上启动。发生了什么事?

14 个答案:

答案 0 :(得分:83)

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

答案 1 :(得分:7)

对于初学者来说,如果你建立在VS2010上,你实际上会有更好的运气..但实际上目标较低版本的.Net(3.5,甚至2.0) )。

如果发布一些代码肯定会有所帮助。

确保已复制应用程序的所有必需文件(app.config等)。

此链接听起来很相似:

.NET 4 Program written/compiled on Windows 7 machine won't run on XP

它指出了这些出色的故障排除提示:

Using Fusion Log Viewer

答案 2 :(得分:6)

您可以远程调试。基本上,这是通过在目标计算机上安装远程调试服务器,然后在启动应用程序时从visual studio连接到它来完成的。可以在此处找到更多信息:http://msdn.microsoft.com/en-us/library/bt727f1t.aspx 这里有一个有点老的教程:http://www.cprogramming.com/tutorial/visual_studio_remote_debugging.html

请注意,您必须使用调试符号(pdbs)进行部署,并且调试的软件必须与您的代码所在的版本相同。

答案 3 :(得分:6)

虽然您的目标是.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为目标。 如果您的客户端足够好,您可以让他创建一个转储文件,这样您就可以轻松地直接调试它。 从SysInternals工具套件下载Procdump,并将其与您的应用程序一起发送到您的客户端。让他执行

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

这将为每个未处理的异常生成一个完整的进程转储,并在进程终止于%TEMP%目录时生成另一个。 Visual Studio 2010获得了更好的转储分析支持,因此您应该能够在Visual Studio 2010中对其进行分析。 如果这没有帮助,您可以下载Windbg(32位here),加载转储并输入

!analyze -v

查看最后一个异常是什么。这应该够了吧。托管扩展可能存在加载right debugging dll(sos.dll for .NET 2,3,3.5和clr.dll for .NET 4)的问题,但是有很多在线教程如何做到这一点。除此之外,我建议在应用程序中添加异常处理程序,以便在应用程序以意外方式终止时获得一个不错的日志文件。

如果输出没有导致正确的堆叠,你可以使用 !ClrStack 和 !线程 找出哪些线程在其堆栈上有异常。

答案 4 :(得分:5)

通常我所做的是将日志文件放在进程之间,这样我就知道程序的流程了。

如果这是一个控制台应用程序,请输入Console.WriteLine(某些字符串),然后您可以将Console.ReadLine()放在最后以暂停程序的执行。

答案 5 :(得分:4)

最近遇到了类似的问题。我遇到的问题是在Windows 7上,我使用的是.ico(图标文件)。但是XP上没有这些支持。在您的应用程序中,如果您使用任何图标文件,请尝试删除它们。看看这是否解决了问题。

答案 6 :(得分:3)

从代码中开始注释掉代码行和整个类/方法,直到你开始工作(或者从注释掉所有内容开始)。然后慢慢开始引入代码行和方法调用等。直到它中断。这应该可以让您了解导致问题的任何特定代码/类或引用。这无疑是一种繁琐的方法,但与此同时,相当机械化,在一个小时左右的时间内,你应该对罪魁祸首有一个相当好的想法。

答案 7 :(得分:3)

我听说一些注释代码会影响执行输出文件,导致类似于您的应用程序的行为。(特别是在VS 2010而不是其他早期版本) 但在另一方面,去年我正在开发一个程序,在其中我使用了Dev Component套件。你知道它的破解工作在.Net Framework 3.5和我的程序平台是.Net Framework 4.同样的事情发生在你的应用程序,发生在我的app.i不得不降级我的平台3.5和它的工作良好。可能这个人经验帮助你。

我想说一些其他的事情,这些错误不依赖于CPU架构。不用担心。

祝你好运。 Ali Foroughi

答案 8 :(得分:3)

“TryCathcWhen”相关的行让我想起启动时的一些未处理的异常,启动时在catch块中抛出异常。

查看您的启动代码会很有帮助。

答案 9 :(得分:1)

我见过这种情况发生在安装.NET 3.5 / 4失败/未成功完成的机器上。但是,这也不大可能。

您应该尝试在机器上安装远程调试(相当简单的过程),然后在Visual Studio中将远程机器设置为目标,在调试模式下运行程序。然后,程序将在远程计算机上启动,您将在Visual Studio中获得完整错误。

答案 10 :(得分:1)

我有一个.Net 2.0应用程序,可用于调试但不是在发布版本中(安装后)。 我没有直接从我的应用程序中获取任何日志记录,我的错误直接来自.NET。问题是我创建了自己的程序类,在main中有一个静态void MAIN(),我有一个try...catch..finally块。出于某种原因,.NET在finally上窒息。你的课程中有这样的东西吗?

答案 11 :(得分:0)

这实际上是一般错误。在我的情况下,由于权限不足,新安装的应用程序无法创建自己的事件源。通过在“以管理员”模式运行应用程序一次解决(丑陋)。确保处理所有内部异常。事件也是一个很好的信息来源。

答案 12 :(得分:0)

就我而言,当用户安装了我正在开发的相同的.Net FW版本时问题就解决了。 (我有FW 4.5.1,用户有FW 4.0)。

所以,检查FW版本:

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

在再次尝试执行

之前安装完全相同

答案 13 :(得分:0)

请注意,我也有类似的例外情况:

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包管理控制台中执行此操作来解决了这个问题:

PM> Install-Package CommonServiceLocator -Version 2.0.5