好吧,这是一个漫长的过程,所以请多多包涵。首先,我会声明自己(出于所有意图和目的)是菜鸟。
我正在尝试使用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提出建议。
答案 0 :(得分:0)
因此,我想我已经找到了发生这种情况的原因-Ironpython无法直接使用MarshalByRefObjects(source),因为Reflection在这些方面不起作用。看来我需要创建一个C#类,可以将该对象转换为所需的对象,将其编译为dll并将其加载到我的Ipy代码中。
我将把此留在这里,以防更多知识的人有更好的答案。