C# Return 类型问题

C# Return Type Issue

我有一个从 Python 调用的 C# Class 库 DLL。 无论我做什么,Python 都认为 return 类型是 (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";
}

如果我 return 一个 (int) 它在 Python 中工作非常可靠。 有人知道发生了什么事吗? 这是我的 Python 代码:

    import ctypes
    import sys
    from ctypes import *

    self.driver = ctypes.cdll.LoadLibrary(self.DLL)
    a= self.driver.Test()

Eoin

仅仅因为数据类型被赋予了相同的名称并不意味着它们实际上是相同的。听起来 python 期待它所谓的 "float".

的不同结构

这个previous answer may be of use, and this answer声明一个pythonfloat是一个c#double;所以我的建议是尝试从您的 C# 代码中返回 double

是的,没错;如 ctypes documentation 中所述,假设所有函数 return ints。您可以通过在外部函数上设置 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'>

或者 return 是 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 环境。