【pythonnet详解】—— Python 和 .NET 互操作的库_pythonnet 详细使用-CSDN博客
Python中动态调用C#的dll动态链接库中方法_python 如何调用c# dll-CSDN博客
需求:Python调用并传List<float>类型参数给.Net
起初:直接 # 创建一个Python浮点数列表 py_float_list = [0.23, 0.34, 0.45],但是报错
def callCS(model_url, methodName, argsType, argsVal, returnType, addition):
# 找到c#程序集
clr.FindAssembly(model_url)
# 解析参数获取命名空间、类名和判断是否为静态方法的标识
namespace, className, static = parseAddition(addition)
# 解析参数
argsParsedArr = parsePyArgs(argsVal, argsType)
print(argsParsedArr)
# 创建一个Python浮点数列表
py_float_list = [0.23, 0.34, 0.45]
listValue= py_float_list
# 设置模块【命名空间】
dll = clr.AddReference(namespace)
#
# #从指定命名空间导入类
# # from ClassLibrary1 import TestCsharp
#动态导入模块
module_1 = importlib.import_module(namespace)
#获取命名下的指定类
class_1 = getattr(module_1, className)
#判断是否为静态方法
if static == '1':
method2 = getattr(class_1, methodName)
# 调用静态方法并打印
print(method2(argsParsedArr[0],listValue))
else:
# 实例化
my_instance = class_1()
# 获取非静态方法
method1 = getattr(my_instance, methodName)
# 调用非静态方法并打印
print(method1(*argsParsedArr))
Python.Runtime.PythonException: 'list' value cannot be converted to System.Collections. Generic.List`1[System.Single],大概可以理解为python中list无法转化为.Net中List<T>[T为泛型]
然后,根据网上博客和AI工具推荐:
在Python中,你需要导入C# DLL,并使用pythonnet
提供的机制来调用C#方法。但是,由于pythonnet
不直接支持C#的泛型列表,你需要将Python列表转换为C#可以理解的数组或其他集合类型。
import clr
# 加载C# DLL,假设DLL名为MyCSharpLibrary.dll,并且位于当前工作目录
clr.AddReference('MyCSharpLibrary')
from MyCSharpLibrary import MyCSharpClass
# 创建一个Python浮点数列表
py_float_list = [1.23, 2.34, 3.45]
# 将Python列表转换为C#可以理解的数组(这里我们使用float数组)
float_array = (clr.Convert(item, System.Single) for item in py_float_list)
float_list = System.Array[System.Single](list(float_array))
# 调用C#方法,传递float数组(或转换为List<float>,如果需要)
MyCSharpClass.ProcessFloatList(float_list)
# 注意:如果C#方法期望List<float>而不是数组,你可能需要创建一个List并填充它
# float_list_csharp = System.Collections.Generic.List[System.Single]()
# for item in py_float_list:
# float_list_csharp.Add(clr.Convert(item, System.Single))
# MyCSharpClass.ProcessFloatList(float_list_csharp)
---------------------------------------------------------------------------
import clr
# 加载C# DLL
clr.AddReference('MyCSharpLibrary')
import MyCSharpLibrary
# 创建一个Python浮点数列表
py_float_list = [1.23, 2.34, 3.45]
# 将Python列表转换为C# float数组
float_array = System.Array[System.Single](py_float_list) # 注意这里直接使用py_float_list可能不起作用
# 正确的做法是使用列表推导式或循环来转换每个元素
float_array = (System.Single(x) for x in py_float_list)
float_array = System.Array[System.Single](list(float_array)) # 将生成器转换为列表,再转换为数组
# 调用C#方法,传递float数组
MyCSharpLibrary.MyCSharpClass.ProcessFloatArray(float_array)
此时报错,无法导入System模块(.Net系统工作空间) ,然后在网上看到博客(试了无效):
看来官方文档,的确试可以导入System命名空间,是不是python、pythonnet、.net版本不匹配或者环境变量设置不正确(待查借助官方文档!!)
pythonnet官方文档 :https://pythonnet.github.io/pythonnet/python.html