本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用。
在 WPF 使用RPC调用其他进程 已经告诉大家调用的原理,但是大家可以看到,如果自己写一个框架是比较难的。
因为我经常调用 C++ 代码,如果C++出现异常,软件会直接退出,所以我就想把 C++ 代码放在其他进程,这样C++运行出现异常了,软件也不会直接退出。
但是如果每次都需要自己写相同的代码,我是不同意的,因为很容易写错。
因为我的代码放在了公司代码使用,所以我不会把源代码放出来,但是大家可以通过复制本文的类来创建框架。
创建端口
创建端口包含一个接口和一个类,因为我需要在一个设备运行,所以为了性能,我不使用 http 连接,这时的端口可以使用一个字符串
为了区分两个程序,我把程序分为两个,一个是 WPF 程序,一个是C++程序。因为另一个程序主要是运行 C++ 代码。
为了让两个程序能联系,就需要约定端口,因为这是框架,可能需要使用 http 通信,所以就需要写一个接口,如果需要使用 http 修改端口就继承,这样框架才可以在很多地方使用。
因为我需要在一个系统运行两个程序,所以我的端口是这样写
调用软件
从 WPF 程序调用 C++ 程序需要告诉他参数,参数就是刚才的端口
这时 C++ 程序使用命令行解析,请看安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils - walterlv
创建一个类用来解析
解析只需要使用主函数传入的 args 就可以拿到端口
这里启动一个新的线程因为C++程序需要使用另一个线程去计算,主函数的线程会如果没有使用 Console.Read()
会退出。
现在 WPF 可以开始调用 C++ 程序,使用下面的代码进行管理
注意现在的代码存在很多类没有引用
从上面代码可以看到,这里使用的连接是 IPC ,因为调用其他进程是在同一个电脑,所以这时使用 IPC 的效率会比 http 和 tcp 高。原因是 IPC 是进程间通信,效率和内存共享差不多。而使用 http 或 tcp 需要把信息发送给本地巡回,然后再返回。而且使用 http 需要做额外的过程,需要走 http 的协议。使用 tcp 需要使用握手,性能都比 IPC 差。
运行的类
所有需要在 C++ 程序运行的类都需要注册,因为C++程序需要找到程序集所有符合的类,所以需要这些类标记
例如有一个类需要在 C++ 程序运行,在 WPF 程序使用,那么就需要这样写
继承 MarshalByRefObject 标记 Remote 就可以了
运行C++程序
运行需要获得程序所有类,需要在C++程序使用的类,实现它。
通道
如果需要两个程序连接,需要创建通道
对于 WPF 程序只需要创建随机的端口,对于 C++ 程序需要创建 WPF 程序告诉他的端口,这样 WPF 程序才可以发送数据到 C++ 程序
使用
尝试把上面的类复制到自己的一个项目,然后创建两个项目,一个是 WPF 程序,一个是C++程序,让两个程序都引用这个项目。
注意创建的项目需要引用 System.Runtime.Remoting
例如创建 MairzearPowhel 程序做 WPF 程序用来调用 SedreaSudome 程序。在 MairzearPowhel 需要引用 SedreaSudome 可以获得里面的类而且用来启动 SedreaSudome 。
对于 C++ 程序只需要几个代码
如果发现无法使用,请联系我
感谢 洪三水提供图片
原文链接: http://blog.lindexi.com/post/WPF-%E5%B0%81%E8%A3%85-dotnet-remoting-%E8%B0%83%E7%94%A8%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。