我在 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;
}
}
结果:
关于c# - 非托管到托管结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750438/