You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个独立exe是否可以访问调用同一个DLL内存中的同一对象?

结论

该需求完全可以实现,但需要注意:默认情况下,两个独立进程加载同一份DLL时,会在各自的地址空间中创建独立的DLL实例,存储在DLL中的对象也会是两份完全独立的副本,无法直接共享。 你需要通过跨进程通信/共享内存方案实现两个进程访问同一个对象的需求。

常用实现方案(按实现成本从低到高排序)
  • 方案1:现有C++ UI进程做代理
    改动量最小的实现方式,不需要修改原有DLL逻辑。你只需要在C++ UI进程中新增跨进程通信(IPC)模块,C# web服务进程通过IPC向C++ UI进程发送操作指令,由已经持有DLL对象实例的C++ UI进程完成对象访问/修改,再将结果返回给C#进程。
    IPC可以选择命名管道、本地Socket、Windows消息等成熟方案,C++和C#都有现成的API可以直接调用。
  • 方案2:DLL新增共享内存段
    如果不想走进程代理,可以修改C++ DLL,在其中创建共享内存段,将需要共享的对象存储在共享内存中。需要注意:共享的对象不能包含指针、虚函数表等依赖当前进程地址空间的成员,否则跨进程访问会直接崩溃。同时你需要自行实现跨进程读写锁,避免两个进程同时修改对象引发数据竞争。
  • 方案3:封装为进程外COM组件
    将DLL中的核心控制逻辑封装为进程外COM服务,配置为单实例模式后,C++进程和C#进程访问的都是同一个COM服务实例中的对象,COM底层会自动处理参数封送、跨进程调用等逻辑,C#调用COM组件也不需要额外写互操作代码,适合对象逻辑比较复杂的场景。
  • 方案4:独立后台服务托管DLL逻辑
    适合后续有扩展需求的场景,将DLL中的全部控制逻辑抽离到一个独立的后台服务进程中,C++ UI和C# web服务都作为客户端,只和后台服务通信,所有对象操作都由后台服务统一处理,架构更清晰,也方便后续新增接入方。
注意事项

无论选择哪种方案,都必须做好多进程同步控制,避免两个进程同时修改同一个对象的状态,引发数据错乱、程序崩溃等问题。

内容的提问来源于stack exchange,提问作者Scott Fraser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:54:05