【发布时间】:2015-08-05 09:14:06
【问题描述】:
我做错了什么;我收到一个错误: 在这一行:
Buffer.BlockCopy((Array) numArray, icondirentry.ImageOffset, (Array)
iconFile.iconImage[index], 0, icondirentry.BytesInRes);
错误:数组的偏移量和长度超出范围,或者计数大于从索引到源集合末尾的元素数。
该方法的完整代码为:
public static IconClass.IconFile FromFile(string filename)
{
IconClass.IconFile iconFile = new IconClass.IconFile();
byte[] numArray = File.ReadAllBytes(filename);
GCHandle gcHandle = GCHandle.Alloc((object) numArray, GCHandleType.Pinned);
iconFile.iconDir = (IconClass.ICONDIR) Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof (IconClass.ICONDIR));
iconFile.iconEntry = new IconClass.ICONDIRENTRY[checked ((int) iconFile.iconDir.Count - 1 )];
iconFile.iconImage = new byte[checked ((int) iconFile.iconDir.Count - 1)][];
int num1 = Marshal.SizeOf((object) iconFile.iconDir);
Type type = typeof (IconClass.ICONDIRENTRY);
int num2 = Marshal.SizeOf(type);
int num3 = 0;
int num4 = checked ((int) iconFile.iconDir.Count - 1);
int index = num3;
while (index <= num4)
{
IconClass.ICONDIRENTRY icondirentry = (IconClass.ICONDIRENTRY) Marshal.PtrToStructure(new IntPtr(checked (gcHandle.AddrOfPinnedObject().ToInt64() + (long) num1)), type);
iconFile.iconEntry[index] = icondirentry;
iconFile.iconImage[index] = new byte[checked (icondirentry.BytesInRes - 1 )];
Buffer.BlockCopy((Array) numArray, icondirentry.ImageOffset, (Array) iconFile.iconImage[index], 0, icondirentry.BytesInRes);
checked { num1 += num2; }
checked { ++index; }
}
gcHandle.Free();
return iconFile;
}
【问题讨论】:
-
icondirentry.BytesInRes - 1 + 1,对不起,但是什么? -
IconClass.IconFile是什么?有大量我们不知道的相关代码...... -
@PakkuDon 你有什么建议?
-
icondirentry.BytesInRes - 1 + 1???? icondirentry.BytesInRes - 0 怎么样?大声笑...
-
@PakkuDon 和 Jon Skeet;抱歉,将代码放在发生错误的位置时有点错误,我现在才更改它,如果您可以帮助我,请