与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);
                }

总的来说还是可以

原文地址:https://www.cnblogs.com/mmclog/p/14250549.html