需求是这样的:
C++中需要结构体如下:
PS:使用的是MFC 静态 DLL工程!
//
struct HCNetConnectData
{
//
CHAR * HCNetServerIP;
//
INT HCNetServerPort;
//
CHAR * HCNetServerUserName;
//
CHAR * HCNetServerPWD;
//
INT *HCNetChannels;
//
INT HCNetChannelSize;
//类似于List<string>
CHAR **FMSServerUrls;
//
INT FMSServerUrlSize;
};
C#中对应结构体如下:
struct HCNetConnectData
{
//
public string HCNetServerIP;
//
public int HCNetServerPort;
//
public string HCNetServerUserName;
//
public string HCNetServerPWD;
//
public int[] HCNetChannels;
//
public int HCNetChannelSize;
//
public string[] FMSServerUrls;
//
public int FMSServerUrlSize;
};
调用方法:
C++:
TEST(HCNetConnectData data);
C# :
[DllImport("TEST.dll", CharSet = CharSet.Ansi)]
static extern int TEST(HCNetConnectData data);
字符串都没有问题,但是在HCNetChannels属性和FMSServerUrls属性时都出现“读取或访问保护内存的错误!”.
纠结其原因主要是因为:
C#中传递的结构体和C++中结构体内存结构不匹配,string[]和CHAR ** ,int[]和INT*不匹配,细节就不在这里详细阐述了。
修改C++的结构体:
//
struct HCNetConnectData
{
//
CHAR * HCNetServerIP;
//
INT HCNetServerPort;
//
CHAR * HCNetServerUserName;
//
CHAR * HCNetServerPWD;
//
INT HCNetChannels[64];
//
INT HCNetChannelSize;
//类似于List<string>
CHAR FMSServerUrls[64][50];
//
INT FMSServerUrlSize;
};
修改C#的结构体:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct HCNetConnectData
{
//
public string HCNetServerIP;
//
public int HCNetServerPort;
//
public string HCNetServerUserName;
//
public string HCNetServerPWD;
//
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public int[] HCNetChannels;
//
public int HCNetChannelSize;
//注意二维数组的声明方式,和C++略为不同。
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64 * 50)]
public char[,] FMSServerUrls;
//
public int FMSServerUrlSize;
};
C#初始化代码:
int channelSize = 64;
HCNetConnectData data = new HCNetConnectData();
data.FMSServerUrls = new char[channelSize, 50];
//第一个地址
char[] urlByte = "rtmp://192.168.1.109/live/camera1".ToCharArray();
for (int i = 0; i < urlByte.Length; i++)
{
data.FMSServerUrls[0, i] = urlByte[i];
}
//第二个地址
urlByte = "rtmp://192.168.1.109/live/camera2".ToCharArray();
for (int i = 0; i < urlByte.Length; i++)
{
data.FMSServerUrls[1, i] = urlByte[i];
}
data.HCNetChannels = new int[channelSize];
for (int i = 0; i < channelSize; i++)
{
//初始化值
data.HCNetChannels[i] = -1;
}
data.HCNetChannels[0] = 1;
data.HCNetChannels[1] = 2;
运行效果: