C#返回类型问题

时间:2016-01-15 11:52:45

标签: c# python .net dllexport

我有一个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()

约恩

2 个答案:

答案 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