2011-10-18 33 views
32

我编写了一个应用程序,可以在我的开发PC(一个窗口7)上安装和工作。.NET应用程序无法启动并接收XamlParseException

  • 开发环境:窗口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窗口机启动。到底是怎么回事?

+1

你在这些机器上检查EVENTVWR之前完全一样? – Joe

+0

@IAbstractDownvoteFactory是..没有任何资料。 – KMC

+0

我用我在eventvwr中发现的异常编辑了我的问题,但尚未解决。 – KMC

回答

79

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

我得到一个StackOverflowException,移除调用** base.OnStartup(e)**似乎修复它。 – MoMo

+0

这里的InnerException在哪里?我们只是简单地获取ExceptionObject,它只是一个对象。我如何追踪InnerException? – teenup

+0

@teenup - e.ExceptionObject通常是异常类型 –

5

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

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

+0

该应用程序甚至没有启动,所以我不能记录任何东西。 – KMC

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

+0

谢谢。我正在使用VS2010,正如您所建议的那样,目标是3.5或3,但多个引用无法通过较低版本的.NET解决。在这种情况下,是否意味着所有写入目标.NET 4的应用程序都不能用于XP SP2或更低版本? – KMC

+0

不,您不需要*定位Net 4.0,除非您的应用明确使用.Net 4.0功能。通常,您通常可以编写更多针对较低版本.Net的“便携”代码。是的,.Net运行时*需要* XP SP3或更高版本:http://www.microsoft.com/download/en/details.aspx?id=17113 – paulsm4

+0

将端口移回到3.5。同样的问题仍然存在。我开始认为这可能是VS2010中的一个错误。 – KMC

3

开始注释掉的代码和整个班线/从你的代码中的方法直到你得到它的工作(或开始通过评论一切)。然后慢慢开始引入代码和方法调用等行,直到它打破。这应该让你了解导致问题的任何特定的代码/类或引用。这确实是一种乏味的方法,但同时,相当机械,在一个小时左右内,你应该有一个相当不错的主意。

3

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

我想说一些其他的东西,这一些错误不取决于CPU架构。不必担心它。

祝你好运。 Ali Foroughi

4

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

+0

感谢您的建议。但是,在删除并删除我的应用程序中的所有图标后,同样的问题仍然存在 - 它不会启动,也不会发生错误或崩溃。 – KMC

+0

你有安装Visual Studio的XP系统(如虚拟系统)吗?如果是这样,请尝试在那里调试它。由于您在XP机器上运行.exe,很难看到异常。但在VS上进行调试时,您会看到确切的问题。图标问题被发现像这样 – katie77

6

您可以远程调试。基本上这是通过在目标机器上安装远程调试服务器完成的,然后在启动应用程序时从视觉工作室连接到它。一些更多的信息可以在这里找到:http://msdn.microsoft.com/en-us/library/bt727f1t.aspx ,有一个稍微年长的教程在这里:http://www.cprogramming.com/tutorial/visual_studio_remote_debugging.html

请注意,您必须使用调试符号(PDBS)部署和调试必须在你的代码是在同一版本的软件

3

的“TryCathcWhen”相关的线让我想起关于启动一些未处理的异常,一个异常被抛出在启动时以catch块。

看到你的启动代码会有帮助。

1

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

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

6

虽然你的目标是.NET 3.5,但你的客户端安装并使用它。字符串

Framework Version: v4.0.30319 

确实告诉我这一点。 要强制客户实际使用.NET 3.5,你应该添加一个App.config到您的应用程序并添加:

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

这可能是因为你得到一个例外,因为以不同的方式.NET 4对待你的XAML。您是否尝试让您的应用程序在.NET 4下运行?如果你没有应用程序。config提供的,尽管你确实是以.NET Framework 3.5为目标的,但你仍然用.NET Framework 4测试了你的应用程序。 如果你的客户端足够好,你可以让他创建一个转储文件,这样你就可以直接调试它。 从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(sos.dll for .NET 2,3,3.5和用于.NET 4的clr.dll),但是有大量的在线教程如何执行此操作。除此之外,我建议将异常处理程序添加到您的应用程序中,以便在应用程序以意外的方式终止时获得一个不错的日志文件。

如果输出没有导致你shold使用 !ClrStack 和 !正确的堆栈线程 找出哪些线程有自己的堆栈上的异常。

+0

如果可以的话,我会不止一次地赞扬这个。很有意思。 – Alex

1

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

0

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