与wmi交互,调非托管代码,单元测试遇到的一些问题
做监视刷卡动作的程序
刷卡后会产生消息,外部能通过wmi的方式获取实时的刷卡动作的数据
程序监听
new ManagementEventWatcher 建对象
watcher.EventArrived 注册事件处理方法
e.NewEvent.GetPropertyValue("Time"); 通过这种方式来获取想要的数据,这个名字一般是卡那边厂商提供你才知道的
接下来就是去调海康摄像头抓图,sdk提供的dll全是C++封装的。这个真不友好
出于安全考虑,获取wmi消息不能远程,所以本机不能测试
对这些三方sdk不熟,不能测试,代码盲写,这是巨坑,只好用单元测试模拟
单元测试不能正常运行,遇到些问题
修改测试配置,选相应的选项, 如x64
wmi的EventArrivedEventArgs不能手动创建,EventArgs强转也报错,但是李氏替换,父转子想想也不可能
那就没法测试了吗?
大不了我不直接调这个事件处理方法,另写一个方法完全复制这个事件处理方法,把事件参数都干掉,加上需要的参数,需要什么我传什么!
果然成了,
继续f10,又出问题了,找不到配置信息
原来测试程序使用自己的config文件,那就把config文件复制到测试项目下
,ok了
后面要求远程方式链接wmi,但是只有内部的某台机器能联。开发这边还是不能联。
//watcher.EventArrived += new EventArrivedEventHandler(HandleEvent); //watcher.Start(); //远程连wmi行不通,报错。
尝试了很多办法报错:RPC不可用,去使用了微软官方的链接工具wmi code creator连接也会报错,排除了代码层面的问题。
微软帖子有牛人给了解决办法太麻烦(连接的两边都要做一些windows底层的各种安全配置),不太可行。。。
发现微软文档示例中使用的是:WaitForNextEvent(),咱也试试看
while (true) { var e = watcher.WaitForNextEvent(); var Time = e["Time"] == null ? "" : e["Time"].ToString(); //HandleWaitForNextEventFunc(e); HandleWaitForNextEventFunc(Time); }
总的来说还是可以