【问题标题】:Ironpython - Issues attaching to an instance of an already running programIronpython - 附加到已运行程序实例的问题
【发布时间】:2019-06-12 23:22:21
【问题描述】:

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

我正在尝试使用 IronPython 链接到正在运行的程序实例 (ETABS)。该程序有一个 API 和关于如何挂钩到正在运行的实例的体面文档 (EXAMPLE)。但是,他们的示例适用于 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 的建议。

【问题讨论】:

    标签: com ironpython comtypes


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2010-12-26
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多