6

有没有一种从 C# 调用 Python 对象的简单方法,即没有任何 COM 混乱?

4

3 回答 3

8

是的,通过托管 IronPython。

于 2009-05-10T15:14:10.210 回答
6

在当前发布的 C# 版本中,如果不使用某种桥接层,就没有很好的方法来实现这一点。您可以在一定程度上托管 IronPython,但由于 C# 是一种非常静态类型的语言,因此很难利用 IronPython 的动态特性

不过,如果您说的是 IronPython,C# 4.0 将能够与它无缝交互。C# 4.0 引入了一个名为dh dynamic 的新功能,它允许它与在 DLR 上运行的任何语言一起工作。

dynamic d = GetSomePythonObject();
d.SomeMethod();
于 2009-05-10T15:16:31.723 回答
5

我知道3种方法:

1)使用 Iron Python,你的 Python 项目可以与 C# 编写的项目自由交互。

2) 将您的 Python 函数公开给 COM。如果您需要使用不想或无法转换为 Iron Python 的 Python 库(例如,如果您只有一个 DLL),您会这样做。“COM 混乱”并不是那么糟糕,如果您的Python 代码和 C# 代码在同一台机器上运行。本教程中的这段代码表明它并不过分难看:

class PythonUtilities:
  _public_methods_ = [ 'SplitString' ]
  _reg_progid_ = "PythonDemos.Utilities"
  # NEVER copy the following ID
  # Use "print pythoncom.CreateGuid()" to make a new one.
  _reg_clsid_ = "{41E24E95-D45A-11D2-852C-204C4F4F5020}"

  def SplitString(self, val, item=None):
    import string
    if item != None: item = str(item)
    return string.split(str(val), item)

# Add code so that when this script is run by
# Python.exe, it self-registers.
if __name__=='__main__':
  print "Registering COM server..."
  import win32com.server.register
  win32com.server.register.UseCommandLine(PythonUtilities)

3) 让 C# 和 Python 通过套接字进行通信。如果您有无法转换为 Iron Python 的代码并且需要远程访问它,您会这样做。这需要最多的工作,因为您需要编组和解组参数并从字节或字符串返回值,但当我们需要让 C# 与远程 Python 进程对话时,这是我的一个团队所做的。

于 2009-05-10T15:18:32.250 回答