c# - 非托管到托管结构

标签 c# marshalling

我在 C# 中接收到来自 C++ 库回调的结构指针

C++结构体(打包为1):

typedef 
{
    int data1[8];
    int data2[8];
    int data3;
    int data3;  
} SomeStruct;

C# 中我有这个等价物:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1), Serializable]
public struct SomeStruct
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public int[] data1

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public int [] data2;

    public int data3;
    public int data4;
};

var 数据包含正确的 IntPtr

SomeStruct ss = (SomeStruct )Marshal.PtrToStructure(pointer, typeof(SomeStruct));

但是我得到的是垃圾,我做错了什么?

谢谢!

最佳答案

这是最简单的可行示例,使用 VC++

您可能需要检查以下内容:

  • 您的代码中的所有内容都正确吗?
  • 您使用的不是 VC++ 吗?
    • 如果是,则检查该编译器的打包和对齐行为

导出符号的Win32 DLL工程:

struct test
{
    int data1[8];
    int data2[8];
    int data3;
    int data4;
};

EXTERN_C MYDLL_API test* Test()
{
    test* pTest = new test;
    for (int i = 0; i < 8; i++)
    {
        pTest->data1[i] = i;
        pTest->data2[i] = i;
    }
    pTest->data3 = 1234;
    pTest->data4 = 5678;
    return pTest;
}

C#测试程序:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var intPtr = Test();
            var ptrToStructure = Marshal.PtrToStructure<Test1>(intPtr);
        }

        [DllImport("MyDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr Test();
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct Test1
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public readonly int[] data1;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public readonly int[] data2;

        public readonly int data3;
        public readonly int data4;
    }
}

结果:

enter image description here

关于c# - 非托管到托管结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750438/

相关文章:

c# - 我应该在帖子中还是在 url 中存储 _method=PUT/DELETE

c# - 从 C# 到 C++ 非托管代码的多个函数调用导致 AccessViolationException

c# - 尝试将托管代码中的字符串返回到 C++

c# - 设置 GetTokenInformation 返回的 TOKEN_PRIVILEGES.LUID_AND_ATTRIBUTES 数组的大小

c# - 在不装箱的情况下将字节数组复制到通用类型

c# - .NET Core 中的专用路由无法识别,生成 404

c# - HashTable 编译错误(缺少强制转换?)

c# - 检查窗体上的按钮单击事件 - C#

c# - 在 Mac OS 上安装窗体应用程序

c# - VS2010中的Marshal结构体指针