我写了一个可以在我的开发PC(Window 7)上安装和工作的应用程序。
在其他客户端计算机(XP SP3,2和1)上,安装时没有错误,但无法启动。在任务管理器中,我可以看到应用程序在关闭之前会短暂占用内存。
我通过以下方式确保了我在开发PC和各种客户端XP机器上的.NET 3.5一致性:
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上启动。发生了什么事?
答案 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
它指出了这些出色的故障排除提示:
答案 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