передача объектов C (CFFI) в .NET (Pythonnet)

Используя Python, я хотел бы использовать структуры C или C ++, определенные в dll, и передать их в .NET dll, написанную на C #. DLL C или C ++ добавляется с помощью cffi, а .NET загружается с использованием pythonnet.

Определение структур идентично в обеих библиотеках.

Вот простой пример для float2, конечно, реальность сложнее 🙂

import sys
import clr
import numpy as np

sys.path.append('my_dot_net.dll')

#load the .NET dll
clr.AddReference("dot_net_dll")

from cffi import FFI
ffi = FFI()

#load C dll
lib = ffi.dlopen('c.dll')

# definition of a simple struct, there is an identical one in .NET
ffi.cdef('''typedef struct
{
float x;
float y;
} float2;''')

from dot_net_namespace import float2

#float2 type in dot net
dotnet_float2 = float2()
dotnet_float2.x = 1.0
dotnet_float2.y = 2.0

#float2 in the c dll
c_float2 = ffi.new("float2 *") # usually numpy array
c_float2.x  = 1.0
c_float2.y  = 2.0

Теперь я хотел бы, например, создайте массив типа данных .NET или назначьте объекты для структуры, доступной в .NET, и назначьте для нее объекты типа C:

dot_net_float2_array = System.Array.CreateInstance(dot_net_float2, 100)
dot_net_float2_array[0] = c_float2 #does not work

dot_net_struct.xy = c_float2 #does not work

Я получаю разные сообщения об ошибках, такие как

TypeError: Cannot convert <cdata 'float2[]' owning 8240 bytes> to dot_net_namespace.float2[]

'_cffi_backend.CDataOwn' value cannot be converted to dot_net_namespace.float2

TypeError: initializer for ctype 'float2' must be a list or tuple or dict or struct-cdata, not float2

Я понятия не имею, как это решить. Реальный код, над которым я работаю, должен использовать структуры, которые содержат массивы структур, и я даже не могу запустить этот простой пример 🙂

Конечно, можно скопировать поле структуры по полю, но есть ли более удобный способ? Это вообще возможно?

Можно ли использовать ffi.cast или же ffi.buffer?

1

Решение

Я закончил передачу указателей на .NET. Они могут быть отлиты, как описано в моем другом вопросе здесь. Полный ответ должен стать видимым, как только мое редактирование будет рассмотрено и принято.

Как привести указатель на структуру Cffi Python в System.IntPtr (.NET)?

После этого Метод Marshal.PtrToStructure (IntPtr, Тип) используется для повторной сборки структур в .NET.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]