动态库常遇到了两个问题
SuperMap Objects .NET动态库常遇到了两个问题
- 背景
大家在使用 SuperMap Objects .NET 时,是不是也遇到过如图一和图二的两个错误?本文将描述这两类错误可能出现的场景,以及解决方案。
图一 常见报错一
图二 常见报错二
这两个错都是在编译通过的情况下,运行时报的错。这个错往往会出现在以下情况后:
1. 工程拷贝到其他的机器;
2. 更新了 bin 包的版本;
3. 机器上同时安装了SuperMap Objects .NET 的产品和SuperMap Objects Java的产品时;
4. 卸载或安装了某些软件后;
5. 代码长时间没使用,再次运行;
下面就为大家整理一下解决这两个问题思路和方法.
* 问题解决
错误一
1. 情况一:机器上同时存在多个版本 Objects .NET,或同时安装了 Objects .NET的产品和 Objects Java 的产品。
解决:查看系统的 Path 路径,如果Path 中有多个 Objects .NET 的路径,只需保留一个当前所使用的路径。如果在 Path 中既有 Objects .NET 的路径又有 Objects Java 的产品,那么您可以通过一下两个途径更改:1.将Objects .NET 的路径写在 Objects Java 的前面,2.如果不能修改系统 Path路径,也可以通过指定工程工作目录(见图三)的方法来指定当前工程所使用的动态库的路径。
图三 指定工程工作目录
2. 情况二 :更新了 bin 包或将工程拷贝到其它机器后,当前工程所引用的动态库的版本,Toolbox中控件的版本,系统的Path 路径中SuperMap Objects .NET的 bin 包版本,三个版本很可能不一致。
解决:手动的检查一下这三个的路径。在工程中查看所引用的 SuperMap 动态库的路径(见图四),查看系统的 Path 路径下所指定的 Objects .NET 的路径
(见图五),Toolbox 中控件的路径(见图六),保证这三者的路径相同,重新编译程序。
图五 系统 Path 路径
图六 Toolbox 中控件的路径
3. 情况三:机器是 64 位的操作系统,在AnyCPU 下运行。
解决:若下载的 SuperMap Objects .NET 32 位版本,机器是 64 位的操作系统,则需要将运行平台改成 x86,而不是 AnyCPU(见图七)。
图七 修改运行平台
* 错误二
- 情况一: 动态库的依赖项被改动或出错
解决:
首先 : 要排除< < 错误一> > 中的各个情况。
然后,按照如下步骤验证动态库的依赖项是否正确。
步骤一:可以先进行一个简单的测试,将 SuperMap Objects .NET 安装目录下的\SampleCode\Bin目录下的ControlsInteractioin.exe拷贝Objects .NET bin目录下,直接运行该exe,此时exe 所调用的动态库就是该bin目录下的动态库,如果不能运行起来,则有可能 bin 包中的动态库有问题,有可能缺少了依赖的库,建议更改更换 bin 包或重新安装。如果可以运行起来,那么很大一部分的可能是系统的原因,就需要进行步骤二检查。
步骤二:在非托管的模式下调试代码(见图八),打开输出窗口,跟踪查看是哪一个库在加载的时候出错,被卸载,导致了报错(见图九)。如图九,在加载SuperMap.Data.dll 的时候发生错误,被卸载(如图十),导致程序最终无法运行。
图八 启动非托管模式
图九 监测输出窗口
图十 动态库被卸载
步骤三:在定位了是哪个动态库出错了之后,将这个动态库从 bin 包中 拷贝出来,放在 SuperMap Objects .NET 安装目录下的 Tools 文件夹中,使用 Tools文件夹下的 DEPENDS.EXE 工具,查看这个动态库的依赖项(见图十一)。如图十所示缺少的依赖项为 SUSCENE600.DLL 文件出错。
图十一 查看依赖项
步骤四:缺少依赖项有可能是在软件卸载或更新时破坏了该文件,也有可能是系统本身缺少动态库。如图找到了缺少的依赖项后,在该项上点击右键,查看文件全路径,定位到该文件中,这个缺少的依赖项很有可能是系统目录下的某些文件,最好是在网上查找一下该文件丢失的原因,下载从相同操作系统中拷贝这个文件。另外,如果情况紧急的话,可以先从SuperMap Objects .NET bin 包中找到相应缺少的动态库,拷贝到系统目录下使用,但还是建议从系统本身进行复结果:修复好的该动态库后再调试程序,查看输出窗口,动态库可以正常加载(见图十二),程序也可以运行(见图十三)。
图十二 成功加载动态库
图十三 运行程序