如何为已运行的Aspen HYSYS进程创建COM接口而非启动新实例
获取已运行Aspen HYSYS进程的COM接口实例
要连接已运行的Aspen HYSYS实例并获取其COM接口,不能直接使用new HYSYS.Application()(这会创建新实例),而是要利用COM的**运行对象表(ROT)**机制,通过以下两种常用方法实现:
方法1:通过ProgID获取活跃实例
使用Marshal.GetActiveObject方法直接获取ROT中已注册的HYSYS实例:
using System.Runtime.InteropServices; HYSYS.Application hyApp = null; try { // 尝试连接已运行的HYSYS实例 hyApp = (HYSYS.Application)Marshal.GetActiveObject("HYSYS.Application"); } catch (COMException ex) { // 无活跃实例时,新建一个 if (ex.ErrorCode == -2147221021) // MK_E_UNAVAILABLE 错误码 { hyApp = new HYSYS.Application(); } else { // 处理其他COM异常 throw; } }
方法2:通过已打开的HYSYS文件绑定实例
如果知道已打开的HYSYS案例文件路径,可使用Marshal.BindToMoniker直接绑定到对应实例:
using System.Runtime.InteropServices; // 替换为实际的HYSYS案例文件路径 HYSYS.Application hyApp = (HYSYS.Application)Marshal.BindToMoniker(@"C:\Projects\MyHysysCase.hsc");
注意事项
- 确保项目已正确引用Aspen HYSYS的COM类型库(在项目中添加COM引用,选择对应版本的"Aspen HYSYS Type Library")
- 若同时运行多个HYSYS实例,
GetActiveObject只会返回第一个匹配的实例;如需遍历所有实例,需通过Windows API操作ROT,实现相对复杂 - 使用完COM对象后,记得手动释放以避免内存泄漏:
if (hyApp != null) { Marshal.ReleaseComObject(hyApp); hyApp = null; }
内容的提问来源于stack exchange,提问作者Reza Afzalan
相关产品推荐
相关产品推荐

