基于ArcEngine的.Net程序崩溃问题解决流程
基于ArcEngine的.Net程序崩溃问题解决流程
报错信息
发布的.net C#程序出现运行程序的机器程序崩溃,崩溃时弹出的对话框信息如下
问题签名:
问题事件名称: CLR20r3
问题签名 01: ATM.exe
问题签名 02: 1.0.0.0
问题签名 03: 616fafc1
问题签名 04: ATM
问题签名 05: 1.0.0.0
问题签名 06: 616fafc1
问题签名 07: 14e
问题签名 08: 5d
问题签名 09: System.IO.FileNotFoundException
OS 版本: 6.1.7601.2.1.0.256.1
区域设置 ID: 2052
其他信息 1: 0a9e
其他信息 2: 0a9e372d3b4ad19135b953a78882e789
其他信息 3: 0a9e
其他信息 4: 0a9e372d3b4ad19135b953a78882e789
捕捉更详细异常信息
而自己的开启机器没有报错(肯定是环境的问题),再网上搜索了一下,不知道怎么解决,后来看到一篇文章添加异常处理捕捉更详细的异常信息,一时豁然开朗。
Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
经过添加异常处理确实捕获到了更详细的异常信息
未能加载文件或程序集“stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。
分析并解决问题
1.原因分析
查看了程序崩溃的机器,发现C:\Windows\assembley目录下没有一个叫stdole程序及名称。并且用EveryThing全磁盘搜索没有搜到stdole.dll。而自己的机器有这个程序集名称,查阅了其他几台机器,确定程序崩溃的机器是C:\Windows\assembley没有这个程序集导致的。存放在C:\Windows\assembley中的程序成为GAC(Global Assembly Cache 全局程序集缓存)程序集。
2.解决办法
将自己上C:\Windows\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a目录下的stdole.dll拷贝到程序崩溃的机器上通过如下命令行运行进行注册。再次运行程序,程序不会崩溃。(注意不同版本的.netframework GAC目录不同)
gacutil.exe -i "d:\stdole.dll"
需要深入思考的问题
(1)注意不同版本的.netframework GAC目录不同,但是我用的.netframework4 竟然GAC程序集放在了C:\Windows\assembley,这个是问题需要后续深入研究。
(2)如果把stdole.dll放在开发程序的bin目录下会报错
强名称验证失败。 (异常来自 HRESULT:0x8013141A)
参考
Arcgis出图时提示未能加载文件或程序集stdole, Version=7.0.3300.0错误
《CLR via C# 》第三版中第3章“共享程序集和强命名程序集“