导入导出模块是由C++开发的, 而当前的客户端用WPF开发的,需要将导入导出功能在WPF中实现一遍,可选的方案有两个:
一、重写导入导出功能
二、重用C++代码,封闭成ActiveX控件。
方案一技术上比较纯净,技术平台统一为C#后,对开发人员的要求也降低了,后期维护较便利;
方案二开发进度较快,而且相对要稳定些,主要是避免了业务的二次实现,本次采用方案二满足项目需求。
现将开发过程总结如下
封装
VS2010
步骤一 新建MFC ActiveX工程
步骤二 添加接口函数
向导生成代码
1 idl
2 .h
3 .cpp
步骤三 添加事件
未在2010中找到添加事件的向导,手动添加事件如下
idl
.h
.cpp
步骤四 代码改造
这部分是和业务相关的, 这里描述下。主要是移除对协议模块、配置模块的依赖,主要是部署时涉及的内容较多。
接口代码编写
完成WPF接口调用向C++逻辑的转换,主要是步骤二中接口函数的实现,与业务独立
移除对既有库的依赖
配置从WPF配置文件读取,协议模块通过事件通知至WPF,由WFP完成HTTP通信,日志模块仍延用(主要原因是改起来涉及面较广)
既有代码改造
最大的改造是:原来的导入、导出是通过窗口事件实现异步的,这在测试过程中发现ActiveX窗口事件失效,修改为线程方式实现。
步骤五 错误处理
控件注册失败
如下,注册过程相当于执行过程,注册是需要所有依赖库存在的
处理方式
控件对外是通过接口、事件实现交互的,建议接口一次定义完成,并且在业务代码添加前完成控件注册,注册完成后,修改为不再注册,工程设置如下图。
主要是控件的注册是需要所有依赖库存在的,本次工程开发过程中因对依赖项不太清楚,导致缺少依赖库,一直注册不成功,耗费了我和何工不少时间。而且开发过程可以专注业务代码编写。当然知道了这个原因,修改为每次注册也是可以的(本次工程开发发现这个原因后,找到了所有依赖库,也是每次都注册)
步骤六 自测
自测采用TstCon.exe,如下工程设置,
1 工程设置
2 启动调试
3 加载控件
4 执行方法
5 断点触发-开始调试
6 接口参数设置
对于有参接口,如下设置
7 控件加载失败
如下,对于自测操作需要所有依赖库就绪,自测就是把控件执行起来了,这种错误基本是缺少依赖的库
模块集成
导出dotNet识别的接口类
2019
只能导出类型库, 在wpf程序中调用会报
灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))
注册控件
WPF工程引用
添加对AxImportExportActiveXLib的引用,如下
WPF源码修改
xaml文件修改
定义变量
初始化
接口调用
事件响应
集成测试
集成测试偏向于开发环境自测,不再赘述
系统测试
系统测试偏向于生产/测试环境自测,重点描述
系统测试时,用到的技术是远程调试,目前无法同时调试控件代码和宿主代码,因此在调试时,需要分开调试,如下说明 。
安装远程调试工具
各个版本的vs均有对应的远程调试工具
vs2010
vs2017
vs2019
环境注册控件
启动远程调试工具(以vs2019为例)
本地vs设置
vs2019
控件调试
对控件代码进行调试,以控件为启动工程
输出参数
远程启动宿主
这种方式会在73上启动IPS3DShell、控件,应用场景不再赘述,通过本地代码进行调试
本地启动宿主
这种方式会在本地启动IPS3DShell、控件,应用场景不再赘述,通过本地代码进行调试
宿主调试
对宿主WPF进行调试,以WPF为启动工程