首页 > 解决方案 > Ironpython - 附加到已运行程序实例的问题

问题描述

好吧,伙计们,这是一个长的,所以请多多包涵。我将首先声明我是 - 出于所有意图和目的 - 一个菜鸟。

我正在尝试使用 IronPython 链接到程序(ETABS)的运行实例。该程序有一个 API 和关于如何挂钩到正在运行的实例(示例)的体面文档。但是,他们的示例适用于 Python、C#、VB.net,但不适用于 IronPython。

我认为没什么大不了的,可以使用 Marshal 模块来连接它。所以我尝试了这个:

from System.Runtime.InteropServices import Marshal
csiApp = Marshal.GetActiveObject("CSI.ETABS.API.ETABSObject") 
SapModel=csiApp.SapModel

不幸的是,我在最后一行出现错误 - “ETABSObject 没有属性 SapModel”。

是的,我尝试使用 csiApp.SapModel() 运行它,结果相同。

所以我更深入地研究了它,显然需要将对象转换为另一种类型 - 至少这是 C# 示例(LINK)的方式。因为 - 据我所知 - 我们不能真正在 Python 中转换对象(是的,我已经尝试过 clr.Convert)我得出的结论是,返回到 Ironpython 的对象是从对象中删除的一些抽象我真的需要。显然,comtypes 可以在后台自动处理这个问题(看到 python 示例完美地工作)。下面的代码块分别显示了返回到 Ironpython 和纯 python 的对象类型:

Ipy : <System.MarshalByRefObject object at 0x000000000000002B [CSI.ETABS.API.ETABSObject]>

Python with comtypes : <POINTER(cOAPI) ptr=0x2e68d17f7c8 at 2e690b36a48> 

我正在使用 Ironpython 2.7.3 并且无法真正更新它(由于与这篇文章无关的几个原因)。希望获得有关如何解决此问题或如何在 Ipy 上安装 comtypes 的建议。

标签: comironpythoncomtypes

解决方案


所以我想我已经找到了发生这种情况的原因——Ironpython 不能直接使用 MarshalByRefObjects ( source ),因为 Reflection 不适用于这些。看来我需要创建一个 C# 类,该类可以将此对象转换为我想要的对象,将其编译为 dll 并将其加载到我的 Ipy 代码中。

我会把这个留在这里,以防有更多知识的人有更好的答案。


推荐阅读