首页 文章

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

提问于
浏览
33

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

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

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

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

  • 应用程序目标 .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导致我的应用程序无法启动XP Window Machine . 到底是怎么回事?

13 回答

  • 7

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

    对于初学者来说,如果你 Build 在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

  • 0

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

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

  • 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),加载转储并键入

    !分析-v

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

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

  • 0

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

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

  • 83

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

  • 1

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

  • 3

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

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

    祝好运 . 阿里福罗伊

  • 1

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

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

  • 4

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

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

  • 3

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

  • 5

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

  • 3

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

    所以,检查FW版本:

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

    并且在再次尝试执行之前安装完全相同

相关问题