如何将python回调传递给c#函数调用



我正在尝试使用c#类从python,使用python.net在mono/ubuntu。

到目前为止,我设法做了一个简单的函数调用与一个参数的工作。我现在要做的是传递一个python回调到c#函数调用。

我尝试了下面的变化,没有工作。有人能告诉我怎么做吗?

// C# - testlib.cs
class MC {
    public double method1(int n) {
        Console.WriteLine("Executing method1" );
        /* .. */
    }
    public double method2(Delegate f) {
        Console.WriteLine("Executing method2" );
        /* ... do f() at some point ... */
        /* also tried f.DynamicInvoke() */
        Console.WriteLine("Done executing method2" );
    }
}
Python脚本

import testlib, System
mc = testlib.MC()
mc.method1(10) # that works
def f():
    print "Executing f"
mc.method2(f)  
# does not know of method2 with that signature, fair enough...
# is this the right way to turn it into a callback?
f2 = System.AssemblyLoad(f) 
# no error message, but f does not seem to be invoked
mc.method2(f2)              

尝试传递ActionFunc,而不仅仅是原始函数:

我在这里使用IronPython(因为现在我没有在我的任何机器上安装mono),但根据Python。. NET文档,我认为它应该工作实际上你的代码几乎没问题,但你需要导入ActionFunc委托取决于你需要什么。

python代码:

import clr
from types import *
from System import Action
clr.AddReferenceToFileAndPath(r"YourPathTestLib.dll")
import TestLib
print("Hello")
mc = TestLib.MC()
print(mc.method1(10))
def f(fakeparam):
    print "exec f" 
mc.method2(Action[int](f))

这是一个控制台输出:

Hello
Executing method1
42.0
Executing method2
exec f
Done executing method2
c#代码:

using System;

namespace TestLib
{
    public class MC
    {
        public double method1(int n)
        {
            Console.WriteLine("Executing method1");
            return 42.0;
            /* .. */
        }
        public double method2(Delegate f)
        {
            Console.WriteLine("Executing method2");
            object[] paramToPass = new object[1];
            paramToPass[0] = new int();
            f.DynamicInvoke(paramToPass);
            Console.WriteLine("Done executing method2");
            return 24.0;
        }
    }
}

我再次阅读Python.net使用泛型的文档,也发现了这个Python。泛型类型的命名和解析看起来需要显式指定参数类型

quote from there:

一个(反射的)泛型类型定义(如果存在泛型类型)的定义给定基名,并且没有具有该名称的非泛型类型)。这个泛型定义可以使用[]语法绑定到封闭泛型类型。试图实例化泛型类型def using()引发TypeError。

看起来你应该显式地定义你的Delegate:

class MC {
    // Define a delegate type
    public delegate void Callback();
    public double method2(Callback f) {
        Console.WriteLine("Executing method2" );
        /* ... do f() at some point ... */
        /* also tried f.DynamicInvoke() */
        Console.WriteLine("Done executing method2" );
    }
}

然后从Python代码(这是基于文档的粗略猜测):

def f():
    print "Executing f"
# instantiate a delegate
f2 = testlib.MC.Callback(f)
# use it
mc.method2(f2)

相关内容

  • 没有找到相关文章

最新更新