我需要将System.IntPtr传递给.NET函数(Python with pythonnet)。这个指针应该指向在cffi中创建的结构体。如何将指向Python cffi结构的指针转换为System.IntPtr(.NET)?
我发现this:
from CLR.System import IntPtr, Int32
i = Int32(32)
p = IntPtr.op_Explicit(i)
这是我试过到目前为止
import clr
from cffi import FFI
ffi = FFI()
custom_t = '''
typedef struct
{
float x;
float y;
float z;
} float3;
'''
ffi.cdef(custom_t)
cfloat3 = ffi.new("float3 *")
cfloat3.x = 1.0
cfloat3.y = 2.0
cfloat3.z = 3.0
print(cfloat3)
from System import IntPtr
p = IntPtr.op_Explicit(id(cfloat3)) #works, sort of...
print(p)
#I would rather see something like
p2 = IntPtr.op_Explicit(ffi.addressof(cfloat3).value)
p3 = IntPtr(ffi.cast("float3*", cfloat3))
p4 = IntPtr(ffi.cast("void3*", cfloat3))
#type(_), ffi.typeof(_), ffi.typeof(_).kind, ffi.addressof()
但我不知道,如果使用IntPtr.op_Explicit是最好的解决方案。它看起来有点像变通方法与id()
相结合,我很确定有更好的解决方案。
这是在我的例子中,P2,不能正常工作。还是为你做? – Joe
我发现这个:IntPtr只是一个.NET类型的void *。它本身并不意味着任何意义。即使它的名字听起来像“指向int的指针”,它也没有与它关联,它与C/C++中的void *等价。 – Joe
在cffi文档中也发现了这一点:要将指针转换为int类型,请将其转换为由C定义的intptr_t或uintptr_t,以使其足够大到足够大的整数类型。但是像'p = IntPtr(int(ffi.cast(“intptr_t”,...)))'也不起作用。 – Joe