是否有一种从C#调用Python对象的简单方法,即没有任何COM混乱?
答案 0 :(得分:8)
是的,托管IronPython。
答案 1 :(得分:6)
在当前发布的C#版本中,如果不使用某种桥接层,就没有很好的方法可以实现这一目标。您可以在某种程度上托管IronPython但很难利用IronPython的动态功能,因为C#是一种非常静态类型的语言
如果你说的是IronPython,C#4.0将能够无缝地与之交互。 C#4.0引入了一个新的calldh动态特性,它允许它与DLR上运行的任何语言一起使用。
dynamic d = GetSomePythonObject();
d.SomeMethod();
答案 2 :(得分:5)
我知道3种方式:
1)使用Iron Python,您的Python项目可以与使用C#编写的项目自由交互。
2)将Python函数公开给COM。如果你需要使用你不想或不能转换为Iron Python的Python库(EG,如果你只有一个DLL),你会这样做。) 如果您的Python代码和C#代码在同一台机器上运行,那么“COM混乱”并不是那么糟糕。 来自this tutorial的代码表明它并不过分丑陋:
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的代码并且需要远程访问它,则可以执行此操作。 这需要最多的工作,因为你需要编组和解组参数并从字节或字符串返回值,但这是我的一个团队在需要与远程Python进程进行C#对话时所做的事情。
答案 3 :(得分:1)
您可以查看此post。