为什么我可以从 IronPython 访问此 API 而不是 Python.NET?

Why can I access this API from IronPython but not Python.NET?

我正在做一个使用 Tekla EPM Open API 的项目。

我使用 IronPython 与它交互没有任何困难,但使用 Python.NET 时运气不佳,我更喜欢它,因为它与其他模块的兼容性更好。

API 文档指出:

There is only one function in the dll file that can be called. The c-style declaration is:

char *_FabSuiteXML( char * );

因此,以下(混淆)代码在 IronPython(3.4.0a1,.NET Framework 4.8.4360.0(64 位)在 win32 上的 .NETFramework v4.6)中按预期工作:

import clr
import sys
sys.path.append('[…]\Tekla\Tekla EPM')
clr.AddReference("FabSuiteAPI")
import FabSuite

interface = FabSuite.FabSuiteAPI.FabSuiteAPI()

connection_string = '''
<FabSuiteXMLRequest>
<Connect>
<IPAddress>XXX.XXX.X.XX</IPAddress>
<PortNumber>XXX</PortNumber>
<Username>XXXXXX</Username>
</Connect>
</FabSuiteXMLRequest>'''

connection_response = interface.FabSuiteXML(connection_string)

print(interface)
#Yields: <FabSuite.FabSuiteAPI.FabSuiteAPI object at 0x000000000000002B [FabSuite.FabSuiteAPI.FabSuiteAPI]>

print(connection_response)
#Yields:
"""
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<FabSuiteXMLResponse xmlns="http://www.fabsuite.com/xml/fabsuite-xml-response-v0108.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Lang>en</Lang>
  <Connect>
    <Successful>1</Successful>
    <FabSuiteMajorVersion>XXXX</FabSuiteMajorVersion>
    <FabSuiteMinorVersion>XXXX</FabSuiteMinorVersion>
  </Connect>
"""

然而,在(普通)python (3.9.5) 中使用 Python.NET,我收到错误:

Traceback (most recent call last):
  File "[…]\overflow_question_code1.py", line 15, in <module>
    connection_response = interface.FabSuiteXML(connection_string)
AttributeError: 'FabSuiteAPI' object has no attribute 'FabSuiteXML'

事实上,python 的 help() 仅显示了 FabSuiteAPI 对象从 System.Object 继承的那些方法。

知道为什么 Python.NET 中没有关键方法吗?

相关但无用的问题: Python: AttributeError: 'module' object has no attribute 'AddReference'?

Python.NET 2.5 不支持 COM 互操作。这是 tracking issue.

有一个长字workaround using .NET reflection

顺便说一句,如果 COM 互操作是使用 Python.NET 的原因,那么实际上您最好使用原生 Python COM 客户端库,例如 win32com