如何在Python中将所有方法调用委托给C#DLL

时间:2018-10-18 16:59:10

标签: c# python python-2.7 python.net

我想将所有方法调用委托给我们编写的C#DLL。我正在使用pythonnet加载DLL文件并从DLL中调用方法。

这是我的python类,工作正常,

import clr
clr.AddReference('MyDll')
from MyDll import MyLibrary


class MyProxy:
    def __init__(self):
        self.lib = MyLibrary()

    def method1(self, first_arg, *args):
        self.lib.method1(first_arg, args)

    def method2(self, first_arg, *args):
        self.lib.method2(first_arg, args)

但是除了调用dll方法外,我没有在python代码中做任何事情,所以我不想为dll中的所有方法编写包装器方法。

以上方法允许我调用python方法,例如MyProxy().method1(first_arg, arg2, arg3, arg4),依次将first_arg作为第一个参数,将arg2, arg3, arg4作为数组作为第二个参数传递给{{ 1}}。

这种行为对我来说是必需的,因为我所有的C#方法都具有签名self.lib.method1(first_arg, args)

如何仅在python类中实现method1(String first_arg, String[] other_args)来实现这一目标?

我尝试了以下方法,但是会引发错误“找不到匹配的方法”,

__getattr__

编辑: 我认为,当我包装这样的DLL方法时,

class MyProxy:
    def __init__(self):
        self.lib = MyLibrary()

    def __getattr__(self, item):
        return getattr(self.lib, item)

python负责将除第一个参数以外的其他参数转换为数组,并将该数组传递给DLL方法。由于python将第二个参数作为数组传递,因此它与DLL方法(def method1(self, first_arg, *args): self.lib.method1(first_arg, args) )的签名匹配。

我们可以在method1(String first_arg, String[] other_args)方法中做任何事情来进行除第一个参数以外的其他参数的数组转换并传递给DLL方法吗?

1 个答案:

答案 0 :(得分:1)

未经测试,但类似的方法可能有效:

class MyProxy:
    def __init__(self):
        self.lib = MyLibrary()

    def __getattr__(self, item):
        lib_method = getattr(self.lib, item)
        def _wrapper(first_arg, *args):
            return lib_method(first_arg, args)
        return _wrapper