我试图使用python for.NET从dll调用python代码C#函数。大多数事情都是开箱即用的,或者我可以从其他帖子中找到它们(比如从下面的数组传递IntPtr),但最后一件拒绝工作的事情是将列表作为参数传递
这是C#函数
bool CalculateResult(string resultName, IntPtr resultArray, IList <dynamic> AuxParameters = null)
以及如何在示例C#代码段中使用它:
CalculateResult("xyz", ptr, new List<dynamic> { 50 });
我确实成功地从python调用了函数,但没有可选的第3个参数:
clr.AddReference('SDK')
import SDK_Namespace
from System import Array, Int16, IntPtr, String
from System.Runtime.InteropServices import GCHandle, GCHandleType
pyArr = [0] * 100
csArr = Array[Int16](pyArr )
arr_hndl = GCHandle.Alloc(csArr, GCHandleType.Pinned)
ptr_arr = arr_hndl.AddrOfPinnedObject()
CalculateResult(result, ptr_arr)
# pyArr has now values, yay!
现在,如果我尝试对一个附加的列表参数执行相同的操作,我会失败:
from System.Collections.Generic import List
pyList = [50]
CalculateResult(result, ptr_arr, pyList)
# TypeError: No method matches given arguments for CalculateResult
CalculateResult.__overloads__[String, IntPtr, List](result, ptr_arr, pyList)
# TypeError: No match found for signature
csList = List[Int16]()
csList.Add(50)
CalculateResult(result, ptr_arr, csList)
# TypeError: No method matches given arguments for CalculateResult
CalculateResult.__overloads__[String, IntPtr, List](result, ptr_arr, csList)
# TypeError: No match found for signature
我错过了什么?我如何才能让这一切顺利进行
编辑
根据Jeroen的评论和对boxing and unboxing的阅读,我能够运行C#函数,如下所示:
from System import Object
par = int(50)
csList = List[Object]()
csList.Add(Object(par))
CalculateResult(result, ptr_arr, csList)
现在,该函数抛出了一个异常,没有多少调试提示
但是,另一个具有类似参数的函数GetInfo(string resultName, IList <dynamic> AuxParameters = null)
告诉我:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot implicitly convert type
'object' to 'int'. An explicit conversion exists (are you missing a cast?)
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at SDK.GetInfo(String ResultName, IList`1 Parameters)
由于我无法更改C#侧的任何内容,我怀疑必须进行拆箱,因此问题更改为:
我还可以做些什么来执行“显式转换”还是必须放弃
不确定这是否适用于您的情况,但我能够在Python中使用它(使用Python for.NET扩展名)进行调用:
在C#方法中显示的对象是
Int32
类型,这可能是预期的我使用与您相同的签名实现了一个测试方法,这就是我使用的:
相关问题 更多 >
编程相关推荐