Ironpython - проблемы, связанные с экземпляром уже запущенной программы - PullRequest
0 голосов
/ 13 июня 2019

Хорошо, ребята, это длинный, так что, пожалуйста, потерпите меня.Я предвосхищу это, заявив, что я - для всех намерений и целей - нуб.

Я пытаюсь связать с запущенным экземпляром программы (ETABS), используя IronPython.У программы есть 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.

1 Ответ

0 голосов
/ 17 июня 2019

Так что я думаю, что нашел причину, по которой это происходит - Ironpython не может напрямую использовать MarshalByRefObjects ( source ), так как Reflection не работает с ними. Кажется, мне нужно создать класс C #, который может привести этот объект к нужному, скомпилировать его в dll и загрузить в мой код Ipy.

Я оставлю это здесь на случай, если у кого-то с большим знанием будет лучший ответ.

...