C# 外部组件发生异常原因分析 [分析]

简介: 在项目中,用From2 启动 Report 正常,用From1 启动 Report 失败,日志: 2007-05-12 13:11:06 StartGenerateReportTask: System.Runtime.InteropServices.SEHException: 外部组件发生异常。

在项目中,用From2 启动 Report 正常,用From1 启动 Report 失败,日志:

2007-05-12 13:11:06
StartGenerateReportTask: System.Runtime.InteropServices.SEHException: 外部组件发生异常。
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.ComponentManager.System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.RunDialog(Form form)
   at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
   at System.Windows.Forms.Form.ShowDialog()
   at ZTE.CCG.Report.ReportController.StartGenerateReportTask(String contractHeader) in ***/report/quotationgenerationmodule/reportcontroller.cs:line 469

由于From2 和 Report 是同一个人开发的,直接启动 ReportController 是没有问题的,而我们自己通过相同的方法启动 ReportController 就出现了问题。开始以为是我们程序那里出现了问题,跟踪代码发现这个异常不固定,很难确定是那里出现了问题。
虽然显示的外部组建发生异常,可应用程序中没有调用任何其他的第三方应用程序哦。

对比Form1 和Form2 发现:
Form1:
        [STAThread]
        public static void Main(string[] args)
        {
           // lots of code...
           // it's same of the code posted on Form2.
        }

Form2:
        [STAThread]
        public static void Main(string[] args)
        {
                Application.EnableVisualStyles();
                Application.DoEvent();
               
           // lots of code...
        }
       
更改Form1中的代码继续执行,程序正常执行,没有任何错误。
取消 那两句话,错误又再次出现。

再查询了一下MSDN ,发现 :
“此方法启用应用程序的 Windows XP 可视化样式。如果控件和操作系统支持可视化样式,则控件将以这种样式进行绘制。若要使 EnableVisualStyles 生效,必须在应用程序中创建任何控件之前调用它;EnableVisualStyles 通常是 Main 函数的第一行。当调用 EnableVisualStyles 时,无需单独的清单即可启用可视化样式。
对于支持 FlatStyle 属性的控件,请确保将 FlatStyle 属性设置为 FlatStyle.System 值。”

搜索 FlatStyle ,发现在 Report 里面很多自定义控件这么写的:

this.xxxControlName.FlatStyle = System.Windows.Form.FlatStyle.System;

也就是说,控件是使用的系统的样式。在使用系统样式的时候必须告诉系统启用虚拟样式。
否则可能出现上述应用程序异常。

为了验证,这个猜想,在From1 中注释掉:
Application.EnableVisualStyles();
Application.DoEvent();
果然程序执行时回出现异常。

在google 上搜索了一下,发现很多上述类似异常的都或多或少提及到XP 样式了。

相关资源:
1).NET 1.1 Framework Fix:
http://support.microsoft.com/Default.aspx?kbid=899511
2)VS2005 中解决方法:
http://support.microsoft.com/kb/897298


Microsoft MSDN 论坛的一些相关信息:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=48878&SiteID=1
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=388724&SiteID=1

 

目录
相关文章
|
开发框架 .NET C#
利用WinDbg分析C#程序产生的转储文件
利用WinDbg分析C#程序产生的转储文件
|
前端开发 C#
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
|
2月前
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
|
4月前
|
编译器 API C#
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
|
2月前
|
安全 测试技术 数据库连接
如何避免 C# 中的异常
【8月更文挑战第27天】
43 2
|
3月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
2月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
40 0
|
4月前
|
C# Windows
C# 串口关闭时主界面卡死原因分析
串口程序关闭导致界面卡死的原因是主线程与辅助线程间的死锁。问题出在`SerialPort.Close()`方法与`DataReceived`事件处理程序。`DataReceived`事件在`lock (stream)`块中执行,而`Close()`方法会关闭`SerialStream`并锁定自身。当辅助线程处理数据并尝试更新UI时,UI线程因调用`Close()`被阻塞,造成死锁。解决办法是让`DataReceived`事件处理程序使用`this.BeginInvoke()`异步更新界面,避免等待UI线程,从而防止死锁。
|
4月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
30 0