none
部分电脑一启动WPF程序就引发异常 RRS feed

  • 常规讨论

  • 我的WPF程序在部分电脑上

    (比如:

             操作系统:Microsoft Windows NT 5.1.2600 Service Pack 3
             运行时版本:2.0.50727.1891

     )

    一启动就报错,错误原因如下,请各位高手指教一二,在下先谢过了

     未将对象引用设置到对象的实例。

     Source:YC4Editor

     TargetSite:Void Application_DispatcherUnhandledException(System.Object, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs)

     StackTrace:   在 YC4Editor.App.Application_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e)
       在 System.Windows.Threading.Dispatcher.CatchException(Exception e)
       在 System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e)
       在 System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler)
       在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
       在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
       在 System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
       在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       在 System.Windows.Threading.Dispatcher.Run()
       在 System.Windows.Application.RunInternal(Window window)
       在 System.Windows.Application.Run(Window window)
       在 System.Windows.Application.Run()
       在 YC4Editor.App.Main()

    而在其他地方则没有这个问题

    2012年6月11日 14:58

全部回复

  • 你在你的主窗体的狗仔方法的第一行加个断点,单步调试下,肯定有个对象为null且被使用了。要不就是你的程序依赖的一些组件在某些电脑内有被安装注册过。先自查下。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月12日 2:30
    版主
  • 你在你的主窗体的狗仔方法的第一行加个断点,单步调试下,肯定有个对象为null且被使用了。要不就是你的程序依赖的一些组件在某些电脑内有被安装注册过。先自查下。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

          以我粗浅的看法,这个好像是WPF在 System.Windows.Threading.Dispatcher.InvokeImpl  这里的时候出错的(还没有涉及到我自己编写的代码),现在问题是我这边的电脑都没有问题,我无法调试,这些错误报告是在其他用户的电脑上收集的信息,并且如果用户如果安装了 微软官方的.NetFramework3.5 就可以解决这个问题(为什么说是官方的呢,因为有些XP用户安装了其他地方的FK3.5之后依然会出现这个问题,但是装一次官方的就可以了)而且部分用户的电脑上调用动态库,代码如下:

            [DllImport("zlib.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern IntPtr FreeCompress(IntPtr ptr);
    
            [DllImport("zlib.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern IntPtr DeCompress(Byte[] data, Int32 length, ref Int32 out_length);
    也会出现问题(我在其他地方调用的时候报:初始化引发异常,也就这两个地方是static,也就是我确定错误出现在这里),但是安装VisualStudio2010准备进行调试的时候,一切问题都没有了~~~这。。。

    ,我无法清楚的理解安装VisualStudio2010的时候发生了什么(但应该不是和Framework有关系,因为我安装官方的FK4.0也还是无法解决问题,难道和RunTime有关?),和这个有什么关系,还请赐教。




    • 已编辑 Agile-- 2012年6月14日 9:42
    2012年6月14日 9:34
  • 其他地方的FK3.5? 当然只有微软发布过.Net Framework 3.5, 其它地方的也是从微软拷贝的。注意要安装SP1,否则会有些没有增加和修复的问题在.Net 3.5中的。

    好吧,你的WPF是基于.Net 3.5开发的,P/Invoke了这个dll. 请问你运行的时候这个zlib.dll放在你的程序相同目录下了吗?你的程序发布为x86还是AnyCpu. 为什么要问这个,因为P/Invoke的dll如果是32位的话,你的程序只能够是运行为x86, 如果dll是64位,则只能运行为现4。千万不要设置为AnyCPU。 因为AnyCPU是根据当前系统支持的平台来选择的,比如说你的XP是64位的,但是dll是32位的,你发布为AnyCPU,则你的程序运行在x64模式,则无法调用dll了。

    还有.Net 4.0是基于CLR 4, 。Net3.5 3.0 2.0都是基于CLR2,所以你的WPF是基于.Net 3.5 (CLR2)的,安装了.Net 4也是没用的。不是同一个CLR


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月14日 10:02
    版主
  • 恩,经过Bob Bao大哥的讲解,这个关于启动失败我知道是什么原因了,是少了SP1。

    但是Bob Bao大哥,这个关于dll的引用,我发布得确实是AnyCPU,但是我觉得不是我发布为AnyCPU的问题,因为在这些有问题的电脑上安装了VisualStudio2010准备调试是什么问题的时候,问题全部都消失了,这确实就弄得我是一头雾水了,难道问题不出在 引用动态库这个地方?但是我这个类里面只有这里是static啊,我看了一篇帖子,http://www.cnblogs.com/kirinboy/archive/2007/11/07/951903.html,我也是根据这个来判断问题出在这里的。


    • 已编辑 Agile-- 2012年6月15日 1:42
    2012年6月15日 1:42
  • AnyCPU如果在64位系统上他就是x64,如果在32位上,他就是x86,所以他是一个灵活的模式。而如果你的 dll只能在32位上工作,且AnyCPU的程序正好也在32位上,则没有问题。 否则AnyCPU把程序Run成x64,但dll无法兼容,则出现问题。所以为了避免这种问题发生,我们最好选择一个平台x64或者x86 和dll的支持平台一致。

    静态类型初始值异常与你的P/Invoke代码关系不大。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月15日 3:46
    版主