You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:32:33