C#向C++原生DLL传递struct*参数时参数不生效问题排查
问题原因与解决方案
核心问题是C#结构体与C++结构体的字段类型不匹配,导致内存布局错位,DLL读取参数时访问了错误的内存地址,表现为始终使用默认值。
关键不匹配点
Windows平台下,C的long类型是32位(4字节),而C#的long是64位(8字节)。你在C#结构体中用long对应C的long,会让每个这类字段多占4字节,整个结构体的内存偏移全部错位,DLL自然读不到你设置的正确参数值。
修正后的C#结构体
把所有对应C++long的字段改成C#的int:
[StructLayout(LayoutKind.Sequential)] public struct CGM2VECTOR_PARAMS { public double width; public double height; public int units; public int demoflag; // 原long改为int public double lineScale; public int logMode; // 原long改为int public int uncompressed; public int colorMode; // 原long改为int public int reverseVideo; // 原long改为int public int mediaColor; // 原long改为int public float boundsCheckRatio; public int outputType; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public float[] marginSize; public int marginUnits; // 原long改为int public double lineWidthMin; public double lineWidthMax; public float extentCheckMargin; public int CSSformat; public int genRegions; public int seqIdentifiers; public int usePaths; public double rotation; }
额外验证点
- 调用约定:C++用
__stdcall,C#DllImport指定CallingConvention.StdCall,这部分是正确的。 - 字符串封送:
LPWStr对应C++wchar_t*,匹配正确。 - 数组字段:
marginSize的MarshalAs设置正确,初始化时的[0,0]也符合要求。
修正后重新测试,结构体的内存布局会和C++端完全一致,DLL就能正确读取你设置的参数值了。
内容的提问来源于stack exchange,提问作者Kingpin
相关产品推荐
相关产品推荐

