Delphi RAD Server 10.4.2:两个共享公共单元的服务器包加载失败问题咨询
在RAD Server多个BPL包间安全共享单元的解决方案
你遇到的这个错误是Delphi运行时包的典型冲突问题:同一个单元UntAccess.pas被打包进了两个独立的RAD Server包(ProjA.bpl和ProjB.bpl),而Delphi的运行时环境不允许同一个单元在进程中存在多个实例,否则会引发全局变量冲突、初始化逻辑重复执行等严重问题。下面是最稳妥的解决办法:
方法一:将共享单元封装到独立的运行时包
这是Delphi官方推荐的多包共享单元的标准方案,步骤如下:
- 创建共享运行时包
- 在Delphi中新建一个运行时包项目(比如命名为
SharedAPIUtils.bpl) - 将
UntAccess.pas以及其他需要在多个RAD Server包间共享的单元添加到这个新包中 - 打开包的项目选项,确认:
- 目标平台是
Win64(和你的RAD Server包一致) - 包类型设置为Runtime Package
- 取消勾选"Link with runtime packages"(避免循环依赖)
- 目标平台是
- 在Delphi中新建一个运行时包项目(比如命名为
- 修改原有RAD Server包的依赖
- 打开ProjA.bpl和ProjB.bpl的项目选项,勾选"Link with runtime packages"
- 在"Packages"选项卡的"Required"列表中添加你刚创建的
SharedAPIUtils.bpl - 从ProjA和ProjB的项目中移除
UntAccess.pas文件(不要再把它直接打包进这两个包)
- 配置RAD Server加载顺序
- 打开
emsserver.ini的[Server.Packages]section,把SharedAPIUtils.bpl放在ProjA和ProjB的前面,因为依赖包必须先于使用它的包加载,比如:[Server.Packages] Package0=C:\...\SharedAPIUtils.bpl Package1=C:\...\ProjA.bpl Package2=C:\...\ProjB.bpl
- 打开
- 部署共享包
- 将编译好的
SharedAPIUtils.bpl放到RAD Server能够访问的目录(可以和ProjA、ProjB放在同一个目录,或者添加到系统PATH环境变量中)
- 将编译好的
关键注意事项
- 确保所有包(共享包、ProjA、ProjB)都使用相同的Delphi版本(10.4.2)和目标平台(Win64)编译,避免版本不兼容
- 如果
UntAccess.pas包含全局变量或者初始化/终结代码,一定要确保这些逻辑在共享包中只会执行一次,不要在多个包中重复触发 - 不要尝试通过“复制单元文件到不同目录并分别编译”的方式绕过这个问题,这会导致更隐蔽的内存冲突和逻辑错误
内容的提问来源于stack exchange,提问作者JRG
相关产品推荐
相关产品推荐

