基于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)

参考

Assembly学习心得

关于GAC全局程序集缓存

如何将程序集(dll)安装到全局程序集缓存(GAC)中

Arcgis出图时提示未能加载文件或程序集stdole, Version=7.0.3300.0错误

《CLR via C# 》第三版中第3章“共享程序集和强命名程序集“

posted @ 2022-03-10 10:12  焦涛  阅读(186)  评论(0)    收藏  举报