【问题标题】:Passing C objects (CFFI) to .NET (Pythonnet)将 C 对象 (CFFI) 传递给 .NET (Pythonnet)
【发布时间】:2018-01-31 21:07:38
【问题描述】:

使用 Python,我想使用在 dll 中定义的 C 或 C++ 结构并将它们传递给用 C# 编写的 .NET dll。 C 或 C++ dll 使用 cffi 添加,.NET 使用 pythonnet 加载。

两个 dll 中结构的定义是相同的。

这里是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

我不知道如何解决这个问题。我正在处理的真实代码应该使用包含结构数组的结构,我什至无法运行这个简单的示例:)

当然可以逐个字段复制structs,但是有没有更方便的方法呢?这可能吗?

是否可以使用ffi.castffi.buffer

【问题讨论】:

  • 你可以用C#写一个接口,然后在pythonnet中使用那个接口。
  • 但这就像一个字段一个字段地复制结构体的原语,对吧?我真的更喜欢使用强制转换或其他方法来解决这个问题,但到目前为止我还没有任何线索。

标签: python c++ .net python.net python-cffi


【解决方案1】:

我最终将指针传递给 .NET。它们可以按照我在此处的另一个问题中的描述进行投射。一旦我的编辑被审核并接受,完整的答案应该会变得可见。

How to cast a pointer to a Python cffi struct to System.IntPtr (.NET)?

在此之后Marshal.PtrToStructure Method (IntPtr, Type) 用于重新组装 .NET 中的结构。

【讨论】:

  • 我在上面链接的问题上发布了答案。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2018-11-09
  • 2012-03-05
  • 2018-10-02
  • 1970-01-01
  • 2023-03-09
  • 2015-08-30
相关资源
最近更新 更多