c# - 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 的出色开发人员,类型转换和参数传递得到了完美的处理!如果其他人遇到同样的问题,我不会删除这个问题。
解决方案
上面的答案是正确的:Pythonnet 将参数传递给 c# dll。我只是想澄清这意味着什么。
发生错误是因为在没有实例化对象的情况下访问了类中的方法。
解决方案是以下两种之一:
- 创建类的实例
- 将 .net 方法标记为静态
问题是错误消息具有误导性,它说“没有方法匹配给定的参数”。这使我试图找到正确的论点。
当我忘记将静态修饰符添加到我调用的.net 方法时,我就发生了这种情况。
推荐阅读
- sql-server - 如何在 EF Core 的存储过程中映射子查询
- python - 在 Python 中打印对象/类的实例
- visual-studio-code - 从集成终端中删除“搜索工作区(cmd+单击)”悬停
- python - Python 中的位运算符
- reactjs - 我想在后端使用 AWS Lambda 无服务器基础设施的反应应用程序中添加多语言支持
- node.js - MongoDB - 带有嵌套子文档和投影的 findOne
- swift - 如何在 swift 中使用泛型类型作为函数的返回类型
- cadence-workflow - 根据信号恢复Cadence Workflow而不阻塞线程
- firebase - 如何在 Firebase 实时数据库规则中使用拆分功能
- mapping - 如何配置 SAML 响应以在 G Suite 中使用 xsi:type="xs:string" 而不是 xsi:type="xs:anyType" 传递属性?