明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1004|回复: 0

[运行时] cad.net 插件模式之进程隔离模式

[复制链接]
发表于 2025-7-18 17:48:21 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 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命令怎么办?
答案就是每次都需要再次注册命令,后来者覆盖.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-16 04:04 , Processed in 0.099948 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表