Тип возврата C# Проблема
У меня есть библиотека библиотек классов C#, которую я вызываю из 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 ответа
Да, это правильно; как объясняется в документации по ctypes, предполагается, что все функции возвращают int
s. Вы можете изменить это предположение, установив 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.
Тот факт, что типы данных имеют одинаковое имя, не означает, что они на самом деле одинаковы. Похоже, что Python ожидает другую структуру для того, что он называет "float"
,
Этот предыдущий ответ может быть полезен, и этот ответ утверждает, что питон float
это AC# double
; так что мой совет будет попытаться вернуть double
из вашего кода C#.