将结构从非托管C ++传递到C#

姆科拉雷克

注意:最终的解决方案是在编辑之后!

我希望有人可以帮助我解决过去几天来一直在尝试解决的问题。

我试图将结构从非托管C ++ DLL传递到C#脚本。这是我到目前为止所拥有的:

C ++

EXPORT_API uchar *detectMarkers(...) {
    struct markerStruct {
            int id;
    } MarkerInfo;

    uchar *bytePtr = (uchar*) &MarkerInfo;

    ...

    MarkerInfo.id = 3;
    return bytePtr;
}

C#

[DllImport ("UnmanagedDll")] 
    public static extern byte[] detectMarkers(...);

...

[StructLayout(LayoutKind.Explicit, Size = 16, Pack = 1)]
public struct markerStruct
{
    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(0)]
    public int Id;
}

...

markerStruct ByteArrayToNewStuff(byte[] bytes){
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    markerStruct stuff = (markerStruct)Marshal.PtrToStructure(
        handle.AddrOfPinnedObject(), typeof(markerStruct));
    handle.Free();
    return stuff;
}

...

print(ByteArrayToNewStuff (detectMarkers(d, W, H, d.Length) ).Id);

问题是这可以工作,但是打印的值是完全关闭的(有时它可以打印约400,有时甚至是最大int值)。

我猜想我在C#中整理结构的方式有问题。有任何想法吗?

编辑:

这是使用ref的有效解决方案:

C ++

struct markerStruct {
    int id;
};

...

EXPORT_API void detectMarkers( ... , markerStruct *MarkerInfo) {
    MarkerInfo->id = 3;
    return;
}

C#

[DllImport ("ArucoUnity")] 
    public static extern void detectMarkers( ... ,
        [MarshalAs(UnmanagedType.Struct)] ref MarkerStruct markerStruct);

...

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MarkerStruct
{
    public int Id;
}

...

detectMarkers (d, W, H, d.Length, ref markerInfo);      
print( markerInfo.Id );
本·沃格特

您将返回一个指向.NET可以读取它的本地变量的指针。在纯C ++中这是一个坏主意,而在p / invoke中这是一个坏主意。

相反,让C#传递指向结构的指针(只需使用ref关键字),然后C ++代码就将其填充。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

来自分类Dev

将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

来自分类Dev

C#将指向结构(包含不可复制类型)的指针传递给非托管C ++ DLL

来自分类Dev

无法将字符串从托管C#传递到非托管C

来自分类Dev

无法将字符串从托管C#传递到非托管C

来自分类Dev

将回调参数从C#传递到非托管C ++

来自分类Dev

将回调参数从C#传递到非托管C ++

来自分类Dev

将字节数组从 C++ 非托管 dll 传递到 C# unity

来自分类Dev

使用IntPtr将结构数组从C#传递到C ++

来自分类Dev

如何从C到C#的结构中获取非托管的可变长度C数组?

来自分类Dev

如何从C到C#的结构中获取非托管的可变长度C数组?

来自分类Dev

将结构数组从C#传递到Delphi

来自分类Dev

当传递给非托管C DLL函数时,C#结构变量保持为空

来自分类Dev

将位图从C#传递到C ++

来自分类Dev

将指针从C#传递到C ++

来自分类Dev

将可变长度的字节数组从C#传递到非托管C ++ dll

来自分类Dev

整理结构数组以从C#调用非托管函数

来自分类Dev

带C#枚举成员的元数据非托管结构

来自分类Dev

将参数从C#传递到Jquery

来自分类Dev

将指针从C#传递到结构数组的指针到C ++

来自分类Dev

如何使用非托管导出将结构数组从.NET传递到Delphi(Robert Giesecke)?

来自分类Dev

使用C#结构将数据从C#COM对象传递到C ++

来自分类Dev

将 C++ 非托管代码转换为 C#

来自分类Dev

从C#通过CLI传递给非托管C ++的引用

来自分类Dev

非托管C#与C ++

来自分类Dev

C#从窗体传递keydown到usercontrol

来自分类Dev

将结构从C ++传递到CLI

来自分类Dev

将结构从C传递到Ada

来自分类Dev

将结构(或类)从C ++ dll传递到C#(Unity 3D)

Related 相关文章

  1. 1

    将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

  2. 2

    将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

  3. 3

    C#将指向结构(包含不可复制类型)的指针传递给非托管C ++ DLL

  4. 4

    无法将字符串从托管C#传递到非托管C

  5. 5

    无法将字符串从托管C#传递到非托管C

  6. 6

    将回调参数从C#传递到非托管C ++

  7. 7

    将回调参数从C#传递到非托管C ++

  8. 8

    将字节数组从 C++ 非托管 dll 传递到 C# unity

  9. 9

    使用IntPtr将结构数组从C#传递到C ++

  10. 10

    如何从C到C#的结构中获取非托管的可变长度C数组?

  11. 11

    如何从C到C#的结构中获取非托管的可变长度C数组?

  12. 12

    将结构数组从C#传递到Delphi

  13. 13

    当传递给非托管C DLL函数时,C#结构变量保持为空

  14. 14

    将位图从C#传递到C ++

  15. 15

    将指针从C#传递到C ++

  16. 16

    将可变长度的字节数组从C#传递到非托管C ++ dll

  17. 17

    整理结构数组以从C#调用非托管函数

  18. 18

    带C#枚举成员的元数据非托管结构

  19. 19

    将参数从C#传递到Jquery

  20. 20

    将指针从C#传递到结构数组的指针到C ++

  21. 21

    如何使用非托管导出将结构数组从.NET传递到Delphi(Robert Giesecke)?

  22. 22

    使用C#结构将数据从C#COM对象传递到C ++

  23. 23

    将 C++ 非托管代码转换为 C#

  24. 24

    从C#通过CLI传递给非托管C ++的引用

  25. 25

    非托管C#与C ++

  26. 26

    C#从窗体传递keydown到usercontrol

  27. 27

    将结构从C ++传递到CLI

  28. 28

    将结构从C传递到Ada

  29. 29

    将结构(或类)从C ++ dll传递到C#(Unity 3D)

热门标签

归档