我有一个C#类库DLL,我从Python调用。 不管我做什么,Python认为返回类型是(int) 我使用RGiesecke.DllExport导出我的DLL中的静态函数,这是我的C#DLL中的一个函数示例:
[DllExport("Test", CallingConvention = CallingConvention.Cdecl)]
public static float Test()
{
return (float)1.234;
}
[DllExport("Test1", CallingConvention = CallingConvention.Cdecl)]
public static string Test1()
{
return "123456789";
}
如果我返回一个(int),它在Python中非常可靠。 有人知道发生了什么吗? 这是我的Python代码:
import ctypes
import sys
from ctypes import *
self.driver = ctypes.cdll.LoadLibrary(self.DLL)
a= self.driver.Test()
约恩
答案 0 :(得分:3)
是的,这是正确的;如ctypes documentation中所述,假设所有函数都返回int
。您可以通过在外部函数上设置restype
属性来覆盖此假设。以下是使用libc(linux)的示例:
>>> import ctypes
>>> libc = ctypes.cdll.LoadLibrary("libc.so.6")
>>> libc.strtof
<_FuncPtr object at 0x7fe20504dd50>
>>> libc.strtof('1.234', None)
1962934
>>> libc.strtof.restype = ctypes.c_float
>>> libc.strtof('1.234', None)
1.2339999675750732
>>> type(libc.strtof('1.234', None))
<type 'float'>
或者对于返回C字符串的函数:
>>> libc.strfry
<_FuncPtr object at 0x7f2a66f68050>
>>> libc.strfry('hello')
1727819364
>>> libc.strfry.restype = ctypes.c_char_p
>>> libc.strfry('hello')
'llheo'
>>> libc.strfry('hello')
'leohl'
>>> libc.strfry('hello')
'olehl'
此方法也适用于Windows环境。
答案 1 :(得分:0)
仅仅因为数据类型具有相同的名称并不意味着它们实际上是相同的。听起来好像python期望它所谓的"float"
的结构不同。
此previous answer可能有用,this answer表示python float
是c#double
;所以我的建议是尝试从你的c#代码返回double
。