我有一个C#app调用的C DLL,使用pinvoke交换数据。在下面的, 我有一个简单的类,包括一个int和2个字符数组。 一切都工作正常:C#正确调用DLL(使用" getStreamGroup"),DLL用正确的数据填充传递的streamGroup结构。
但是,一旦C函数完成,并且我们回到C#端,传递并填充正确数据的streamGroup现在是荒芜的:3个空值。 VS2010没有错误/警告。这是一款64位应用程序。 有什么想法吗?
#define STREAM_COUNT 9000
typedef struct s_streamGroup
{
int systemDefinedGroup;
char name[BUFFER_SIZE_128];
char streamList[STREAM_COUNT];
} streamGroup;
public class streamGroup
{
public int systemDefinedGroup;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = constants.BUFFER_SIZE_128)]
public byte[] name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = constants.STREAM_COUNT)]
public byte[] streamList;
}
DLL int getStreamGroup( int groupIndex, streamGroup *RequestedStreamGroup)
{
*RequestedStreamGroup = Environment.StreamGroup[groupIndex];
return(DLL_NO_ERROR);
}
[DllImport(constants.DLL_PATH, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int getStreamGroup([In] int groupIndex, [In, Out] streamGroup group);
答案 0 :(得分:0)
您需要在streamGroup之前使用[StructLayout(LayoutKind.Sequential)]。
如果这还不够,请让您的代码更清晰一点。我不确定什么代码在什么项目中(如果我理解正确你有一个本机C ++项目和一个C#项目)。如果我的理解不正确,请给两个单独的列表显示哪个是哪个,或者解释你在做什么。