.NET应用程序无法启动并收到XamlParseException
我写了一个应用程序,可以安装和工作在我的开发电脑(一个窗口7)。
- 开发环境:Windows 7,VS2010安装了.NET 4和.NET 3.5的 WPF C#
在其他客户端计算机(XP SP3,2和1)上,安装时没有错误,但无法启动。 在任务pipe理器中,我可以看到应用程序在自己closures之前暂时占用内存。
我已经确定了我的开发PC和各种客户端XP机器的.NET 3.5一致性:
- 该应用程序的目标是.NET 3.5 (或3.5客户端configuration文件 )
- 使用VS2010安装程序进行部署:在启动条件下以.NET 3.5为目标
- 在debugging应用程序和安装程序项目期间,没有任何有关.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的Windows机器上。 到底是怎么回事?
XamlParseException
是在应用程序启动时出现问题时发生的一般错误。 我build议你修改你的应用程序启动代码来追踪真正发生的事情,不仅是XamlParseException,还有内部exception,这些exception可以帮助你确定问题的根源。 这里是一个例子:
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()); } } }
对于初学者来说,如果你在VS2010上构build的话,你实际上会有更好的运气。但是实际上是针对 .Net(3.5,甚至2.0)的更低版本。
如果你发布了一些代码,这肯定会有帮助。
确保你已经复制了你的应用程序的所有必要的文件(app.config等)。
这个链接听起来类似:
在Windows 7机器上编写/编译的.NET 4程序将不能在XP上运行
它指向这些优秀的故障排除技巧:
使用Fusion Log Viewer
你可以远程debugging。 基本上这是通过在目标计算机上安装远程debugging服务器来完成的,然后在启动应用程序时通过Visual Studio连接到它。 一些更多的信息可以在这里find: http : //msdn.microsoft.com/en-us/library/bt727f1t.aspx这里有一个有点老人的教程在这里: http : //www.cprogramming.com/tutorial/visual_studio_remote_debugging.html
请注意,您必须使用debugging符号(pdbs)进行部署,并且debugging的软件必须与您的代码所在的版本相同。
虽然你的目标是.NET 3.5,你的客户端安装并使用它。 string
Framework Version: v4.0.30319
告诉我这一点。 要强制客户端实际使用.NET 3.5,您应该添加一个App.config到您的应用程序并添加:
<configuration> <startup> <supportedRuntime version="v2.0.50727"/> </startup> </configuration>
这可能是因为.NET 4以一种不同的方式处理您的XAML,所以您得到一个exception。 你有没有试图让你的应用程序在.NET 4下运行? 如果您没有提供App.config,则无论如何您都是使用.NET Framework 4testing您的应用程序,尽pipe您确实是以.NET Framework 3.5为目标的。 如果你的客户端足够好,你可以让他创build一个转储文件,所以你有一个简单的方法来直接debugging它。 从SysInternals工具套件下载Procdump并将其与您的应用程序一起发送到您的客户端。 让他执行
procdump -ma -e -t -x foo.exe %temp%\dump.dmp
这将为每个未处理的exception生成一个完整的进程转储,并在进程终止到%TEMP%目录时生成另一个。 Visual Studio 2010已经得到了更好的转储分析支持,因此您应该能够在Visual Studio 2010中对其进行分析。如果这无助于您下载Windbg(32位),请加载转储并键入
!分析-v
看看最后一个例外是什么 这应该够了吧。 托pipe的扩展可能会出现问题,以加载正确的debuggingdll (.NET 2.3.3.5的sos.dll和.NET 4的clr.dll),但是有大量的在线教程如何做到这一点。 除此之外,我build议将exception处理程序添加到您的应用程序中,以便在您的应用程序以意外的方式终止时获得一个不错的日志文件。
如果输出没有导致正确的堆栈,请使用!ClrStack和!线程来找出哪些线程在堆栈上有exception。
通常我所做的是将日志文件放在进程之间,这样我就知道了我的程序的stream程。
如果这是一个控制台应用程序,把Console.WriteLine(一些string),然后你可以把Console.ReadLine()在最后暂停执行你的程序。
最近遇到类似的问题。 我遇到的问题是在Windows 7上,我正在使用.ico(图标文件)。 但在XP上没有这些支持。 在你的应用程序中,如果你正在使用任何图标文件,请尝试删除它们。看看这是否解决了问题。
从代码开始评论代码行和整个类/方法,直到你得到它的工作(或开始通过评论一切)。 然后慢慢开始引入代码和方法调用等行,直到它打破。 这应该给你一个任何特定的代码/类或引起问题的引用的想法。 这是一个单调乏味的方法,但同时也是相当机械的,大约一个小时之内,你应该有一个相当不错的罪魁祸首。
我听说有些注释代码会影响执行输出文件的行为,类似于您的应用程序(特别是在VS 2010中,而不是其他早期版本),但在另一方面,去年我正在开发一个程序,开发组件套件。 因为你知道它的破解只是在.Net Framework 3.5中工作,我的程序平台是.Net Framework 4.同样的事情发生在你的应用程序,发生在我的app.i不得不降级我的平台到3.5和它的工作good.maybe这个人经验帮助你哥们。
我想说一些其他的东西,这一些错误不取决于CPU架构。不必担心。
祝你好运。 阿里Foroughi
“TryCathcWhen”相关行让我想起了启动时的一些未处理的exception, 或者在启动时抛出exception。
看到你的启动代码会有帮助。
我已经看到这种情况发生在.NET 3.5 / 4安装失败/未成功完成的机器上。 但是,这也不太可能。
您应该尝试在机器上安装远程debugging(相当简单的过程),然后将远程机器设置为Visual Studio中的目标,以debugging模式运行该程序。 该程序将在远程机器上启动,您将在Visual Studio中得到完整的错误。
我有一个.Net 2.0应用程序与debugging工作,但不是在发布版本(安装后)。 我没有直接从我的应用程序获取日志,我的错误直接来自.NET。 问题是我创build了我自己的程序类与主静态无效MAIN()我有一个try...catch..finally
块。 由于某种原因,.NET finally
窒息了。 你的程序中有类似的东西吗?
这实际上是一个通用的错误。 在我的情况下,由于权限不足,新安装的应用程序无法创build自己的事件源。 通过以“pipe理员”模式运行应用程序一次解决(丑陋的一个)。 确保处理所有内部exception。 事件也是一个很好的信息来源。
在我的情况下,当用户安装了我正在开发的.Net FW版本时,问题就解决了。 (我有FW 4.5.1和用户有FW 4.0)。
所以,检查FW版本:
http://msdn.microsoft.com/library/hh925568(v=vs.110).aspx
并且在再次执行之前安装完全相同