在windows系统上,进程间通信是一种很古老,很成熟的技术了,但是遇到unity这种技术就有点不好使了。最近项目需要进程间通信,我试了很多方法就是不好使,最后只能用socket。我用到的通信方式有以下几种:
一、管道通信,命名管道在.net里可以做全双工通信,但是到unity里只能是单工通信。还是只能完成收,时不时的收到空消息。
二、消息队列,这种方式纯粹是不好使。
三、IPC通道的方式,在 unity里一运行就报错
错误如下:
InvalidProgramException: Invalid IL code in System.Runtime.Remoting.Channels.Ipc.IpcClientChannel:get_ChannelName (): IL_0000: ret

四、调用windwsAPI,做共享内存的方式,有人会说C#已经封装了共享内存的方式,不用调用windowsAPI,你得明白unity只支持.net3.5的版本。C#封装共享内存是.net 4.0出的。所以必须采用原生的方式。但是在调用windowsAPI 的时候数据能发到unity里边,unity向别的进程发数据,数据就收不到了 。
五、RPC这种方式有点扯了对于unity来说。
六、利用消息钩子,进行进程间通信,这种方式有点麻烦的是必须得知道对方窗体的名字。不然钩子无从下手,我嫌这种方式麻烦,所以我也舍弃了。
七、说道最后,大家都能猜到我用什么方式了 ,unity在怎么阉割,他的通信方式还是要有的,那就是socket,在同一台机器上做udp的定向通信,这样就解决了unity进程间的通信。

最近在做项目的时候发现还有一种方式可以做到进程间通信,这种方式比较古老,对于unity来说是一种高效的方式,那就是内存共享,unity虽说支持.net ,但是只支持.net2.0的阉割版,在C# 6.0里已经封装了内存共享,使用还是比较方便的,但是unity不支持,所以对于unity我们就得用c++封装一次,暴露接口,然后pinvoke调用,这样就可以使用了这个dll。