首先简单描述下程序运行的步骤,
我们要去加载两个DLL,先加载的称为A,后加载的称为B,加载A在里面做的事情是动态创建一个全局对象,加载B在里面做的事情是取得这个全局对象,然后干其他事情。
我们机子上运行的非常完美。但在用户的机子上却没法运行。报错直接说这个全局对象为空,并没被初始化。真是奇了怪了。
开始认为我们的加载顺序有问题,查了下代码,没问题!
我们把程序放在WIN7下测试,也没问题。后来另一位同事在另个新系统下面测试,BUG重现!然后同事想把Visual Studio装上调试,居然又运行完好。头儿提醒可能是加载A没成功。于是卸载VS,先在A中打上日志,又在加载A之前打上日志,一看,发现果然是这个问题!!
但为啥会加载失败呢?用depends查看A有两个依赖的dll未知!另外还有个帮忙的同事提醒说,加载失败,可能是由于清单文件所依赖的组件在新安的系统并没有。一看清单*.mainifest文件,果然如此,多了两个外来的动态依赖库,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
但转念一想,不对啊,B都没这两个外来组件引入的清单,A怎么多了这两个东西!
将A和B对比编译配置,完全相同,百思不得其解!
帮忙的同事又说,A所依赖的我们项目中的dll会不会有动态库?一查,果然如此,另一个的编译选项居然是Use MFC in a share dll!照理说应该编译过不了,但可爱的同事用忽略库的办法将其编译错误去掉,于是导致A生成的清单文件上会出现上述内容。
应该说,粗心是不可避免的。
但有几点需要以后注意的:
1. 捕获异常措施不够,是其本质原因。
2. 测试环境需要真正模拟玩家环境。