由于是结构体中的数组: public struct aa public int dwSize; [MarshalAs(UnmanagedType.ByValArray,sizeConst = 10)] public bb[] cc; }public struct bb public int dwTime; }现调用: aa dd = new aa(); System.array.Clear(dd.cc,0,dd.cc.Length);报错:“未将对象引用设置到对象实例”不知该怎样处理?
aa dd = new aa(); dd.cc = new bb[10];//这个要实例化 System.array.Clear(dd.cc,0,dd.cc.Length);
array[1] = 1;
Array.Clear(array, 0, array.Length);
Console.Write(array[1]);
public struct aa
public int dwSize;
[MarshalAs(UnmanagedType.ByValArray,sizeConst = 10)]
public bb[] cc;
}public struct bb
public int dwTime;
}现调用:
aa dd = new aa();
System.array.Clear(dd.cc,0,dd.cc.Length);报错:“未将对象引用设置到对象实例”不知该怎样处理?
dd.cc = new bb[10];//这个要实例化
System.array.Clear(dd.cc,0,dd.cc.Length);
这里只修饰了再p/invoke时候的长度。并没有实际的实例化。
不知道bb是什么意思,如果按楼主的想法,给赋值默认值为0,那估计是byte,int这类的值类型,值类型就不用再手工实例化了。
恩。对。只要实例化就可以了。.net默认赋值0.
{
public uint dwSize;
/// <summary>
/// 轮巡时间
/// </summary>
public uint dwPoolTime;
/// <summary>
/// NET_DVR_MATRIX_DECCHANINFO struchanConInfo[MAX_CYCLE_CHAN];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst =HCNetSDK.MAX_CYCLE_CHAN )]
public NET_DVR_MATRIX_DECCHANINFO[] struchanConInfo;
} public struct NET_DVR_MATRIX_DECCHANINFO
{
/// <summary>
/// 是否启用 0-否 1-启用
/// </summary>
public uint dwEnable;
/// <summary>
/// 轮循解码通道信息
/// </summary>
public NET_DVR_MATRIX_DECINFO struDecChanInfo;
}
public struct NET_DVR_MATRIX_DECINFO
{
/// <summary>
/// DVR IP地址
/// char sDVRIP[16];
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string sDVRIP;
/// <summary>
/// 端口号
/// </summary>
public ushort wDVRPort;
/// <summary>
/// 通道号
/// </summary>
public byte byChannel;
/// <summary>
/// 传输协议类型 0-TCP, 1-UDP
/// </summary>
public byte byTransProtocol;
/// <summary>
/// 传输码流模式 0-主码流 1-子码流
/// </summary>
public byte byTransMode;
/// <summary>
/// public byte byRes[3];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] byRes;
/// <summary>
/// 监控主机登陆帐号
/// public byte sUserName[NAME_LEN];
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAME_LEN)]
public string sUserName;
/// <summary>
/// 监控主机密码
/// public byte sPassword[PASSWD_LEN];
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = PASSWD_LEN)]
public string sPassword;
}现调用:
HCNetSDK.NET_DVR_MATRIX_LOOP_DECINFO lpInter = new HCNetSDK.NET_DVR_MATRIX_LOOP_DECINFO();
System.Array.Clear(lpInter.struchanConInfo, 0, lpInter.struchanConInfo.Length);运行到System.Array.Clear时报:“未将对象引用设置到对象实例,在调用方法前通过检查确定对象是否为null”
这样修改试试
HCNetSDK.NET_DVR_MATRIX_LOOP_DECINFO lpInter = new HCNetSDK.NET_DVR_MATRIX_LOOP_DECINFO();
lpInter.byRes = new byte[3];不要clear了。.net默认值就是0,c++不写的时候不给默认值,.net不用。