- 积分
- 19528
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2025-7-18 21:30 编辑
现在我们的插件是dll模式,
本质上是引用了acmgd.dll/acdbmgd.dll/accoremgd.dll
然后把这些打包成nuget包,再把包上传给微软服务器,
IDE就可以根据工程文件自动下载对应的包.
dll模式有个不好的地方,也就是难以热更新.
因为直接引用相应资源存在耦合资源,卸载会出错,
耦合资源是必然存在的,尤其是一些托管资源的指针在C++/CLI之间相互传递,没有考虑卸载时候拆开GCHandle钉住模式.
既然我们无法让桌子去改,那么我们能不能自己实现一个插件模式是可以随时随地热更新呢?
有的,兄弟有的.
那就是独立进程的插件模式.
采用这模式的有谷歌浏览器,vs code等...所以不必担心效率如何.
首先我们把上面的三个dll导出为接口文件.
我选择gRPC作为通讯协议.(remoting/WCF被淘汰了)
也就是制作一个工具,先在cad中加载dll,反射对应的程序集,导出函数表构造gRPC文件格式.
接口是一种路由方式而已:
服务端要实现接口.
客户端根据接口寻找服务里面的实现.
那么服务端(cad内插件)如何实现接口?
通过DI自动映射原生的dll函数就好了.
并且增加看门狗进行通讯续命,心跳保证.
客户端插件为了尽可能少地修改,
采用更换nuget包,直接通过接口编程了.
这样一来除了可以实现客户端插件热更新,还可以防止插件崩溃造成主进程acad的损害.
还可以实现对外Http调用cad.net函数.
这样可能改变一些编程方式,
例如遍历块表,通讯成本还是蛮高的,
应该是封装一个新的遍历方法,把判断条件传给服务端.
而不是每次把遍历内容传给客户端判断之后再回传服务端.
热更新之后,重新建立通讯,那么cad命令怎么办?
答案就是每次都需要再次注册命令,后来者覆盖. |
|