首页 > 解决方案 > Pythonnet 将参数传递给 c# dll

问题描述

我正在使用 Pythonnet 2.4.0 来访问 C# dll。我有一台装有 Python 3.7.6 的 Windows 10 机器。

我正在尝试使用一种仅将路径字符串作为参数的方法,但我无法使其工作。

import clr
sys.path.append(os.getcwd)
clr.AddReference('C#Wrapper')

path = "C:\\Users\\Username\\Folder"

c#class.method(string path)

如果我使用 pythonnet 中的重载属性,它会告诉我参数应该是 System.String 类型,但是执行以下类似操作也无济于事:

path = System.String("C:\\Users\\Username\\Folder")

我不断收到 TypeError: No Method matches given arguments。我是否需要对字符串进行编码或制作一个 char 数组才能让 c# 能够理解它?

编辑:

我刚刚在 dll 中找到了一个测试函数,它只接受一个 Int32 参数,我也遇到了同样的问题!我试过这样的事情:

import ctypes
c#class.testmethod(ctypes.c_int32(1))

from System import Int32
c#class.testmethod(Int32(1))

但没有任何效果。如何将参数传递给 c# dll?

[解决了]:

我自己想通了。在第二种情况下,我只是忘记实例化一个类对象。我应该这样做:

classobj = c#class()
classobj.testmethod(1)

这让我意识到,在第一种情况下,我遇到了基本相同的问题。我按照 Visual Basic 手册编写了我的 Python 程序,上面写着这样的话:

classobj = c#class

但是在 Python 中,您需要编写:

classobj = c#class()

所以缺少括号导致TypeError: No Method matches given arguments,这是非常误导的。感谢 phythonnet 的出色开发人员,类型转换和参数传递得到了完美的处理!如果其他人遇到同样的问题,我不会删除这个问题。

标签: c#stringdllpathpython.net

解决方案


上面的答案是正确的:Pythonnet 将参数传递给 c# dll。我只是想澄清这意味着什么。

发生错误是因为在没有实例化对象的情况下访问了类中的方法。

解决方案是以下两种之一:

  • 创建类的实例
  • 将 .net 方法标记为静态

问题是错误消息具有误导性,它说“没有方法匹配给定的参数”。这使我试图找到正确的论点。

当我忘记将静态修饰符添加到我调用的.net 方法时,我就发生了这种情况。


推荐阅读