typedef struct Field55
{
char ctag[100][5];
int iLen[100];
char cValue[100][512];
}ICINFOTEMP;
然后再c#中这样定义
public struct ICINFO
{
[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
public string [] tag;
[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100)]
public int [] Len;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100 * 512)]
public string [] Value;
}
编译时报错“内部限制:结构太复杂或太大”。请问大大,该如何修改?
10 个解决方案
#1
SizeConst 把这个值改小点
http://apps.hi.baidu.com/share/detail/34088407
http://apps.hi.baidu.com/share/detail/34088407
#2
不会C++ ,路过。
#3
楼主,你这样声明肯定是不对的,那是一维数组的方式,
“[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
public string [] tag;”
这个声明的意思:500个string数组,但每个string是多大,编译器完全不知!这就违背的互操作的初衷:它必须知道具体的结构体大小!
“[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
public string [] tag;”
这个声明的意思:500个string数组,但每个string是多大,编译器完全不知!这就违背的互操作的初衷:它必须知道具体的结构体大小!
#4
并不是非托管调用的char都用string代替,仅当以空零结束的in类型字符串采用string的。
你这个用byte二维数组就可以了。传参之前分配即可。
你这个用byte二维数组就可以了。传参之前分配即可。
#5
能具体给出定义和初始化的代码么?
#6
封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] //注意:这里对应一维数组 public str[] name;
}
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] //注意:这里对应一维数组 public str[] name;
}
#7
封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] [b ]//注意:这里对应一维数组[/b]
public str[] name;
}
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] [b ]//注意:这里对应一维数组[/b]
public str[] name;
}
#8
麻烦你帮那3个变量都帮我弄好行么?我刚改了调试下,还是提示结构太复杂或太大。
#9
晕,我给把“char cValue[100][512];”都跟你写了,剩下就char ctag[100][5]; 做法都一样,
照样你也它高出来,你怎么还要我写!
有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!
照样你也它高出来,你怎么还要我写!
有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!
#10
霸气
#1
SizeConst 把这个值改小点
http://apps.hi.baidu.com/share/detail/34088407
http://apps.hi.baidu.com/share/detail/34088407
#2
不会C++ ,路过。
#3
楼主,你这样声明肯定是不对的,那是一维数组的方式,
“[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
public string [] tag;”
这个声明的意思:500个string数组,但每个string是多大,编译器完全不知!这就违背的互操作的初衷:它必须知道具体的结构体大小!
“[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 100*5)]
public string [] tag;”
这个声明的意思:500个string数组,但每个string是多大,编译器完全不知!这就违背的互操作的初衷:它必须知道具体的结构体大小!
#4
并不是非托管调用的char都用string代替,仅当以空零结束的in类型字符串采用string的。
你这个用byte二维数组就可以了。传参之前分配即可。
你这个用byte二维数组就可以了。传参之前分配即可。
#5
能具体给出定义和初始化的代码么?
#6
封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] //注意:这里对应一维数组 public str[] name;
}
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] //注意:这里对应一维数组 public str[] name;
}
#7
封送多维(2维以上)的数组,一直是互操作的难题!远非4楼所说那么简单,根据以往经验,我总结了一个办法:
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] [b ]//注意:这里对应一维数组[/b]
public str[] name;
}
将数组尾数扁平化,变成一维数组,以楼主的结构体中 char cValue[100][512];为例:
1、定义子结构体:
[StructLayout(LayoutKind.Sequential)]
public struct str
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string name;
}
2、外层结构体:对于C++:
[StructLayout(LayoutKind.Sequential)]
public struct ICINFO
{
............
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] [b ]//注意:这里对应一维数组[/b]
public str[] name;
}
#8
麻烦你帮那3个变量都帮我弄好行么?我刚改了调试下,还是提示结构太复杂或太大。
#9
晕,我给把“char cValue[100][512];”都跟你写了,剩下就char ctag[100][5]; 做法都一样,
照样你也它高出来,你怎么还要我写!
有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!
照样你也它高出来,你怎么还要我写!
有点气愤:你如果是我的手下,肯定被开除!希望你培养自己的良好习惯!
#10
霸气