C# System.AccessViolationException是否使用双指针?
我想在托管代码中将纹理压缩到pvrtc,这样我就找到了一个符合我要求的源代码,但我得到了System.AccessViolationException。这是我目前使用的代码:C# System.AccessViolationException是否使用双指针?,c#,pointers,double,C#,Pointers,Double,我想在托管代码中将纹理压缩到pvrtc,这样我就找到了一个符合我要求的源代码,但我得到了System.AccessViolationException。这是我目前使用的代码: [DllImport("x86/pvrtc.dll", CallingConvention = CallingConvention.StdCall)] private static extern IntPtr CompressTexture(byte[] data, int height, int width, int m
[DllImport("x86/pvrtc.dll", CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr CompressTexture(byte[] data, int height, int width, int mipLevels, bool preMultiplied, bool pvrtc4bppCompression, ref IntPtr dataSizes);
public static byte[] Compress(byte[] data, int height, int width, int mipLevels, bool preMultiplied, bool pvrtc4bppCompression)
{
IntPtr dataSizesPtr = Marshal.AllocCoTaskMem(data.Length + 1);
var texDataPtr = CompressTexture(data, height, width, mipLevels, preMultiplied, pvrtc4bppCompression, ref dataSizesPtr);
//Store the size of each mipLevel
var dataSizesArray = new int[mipLevels];
//Copies data from an unmanaged memory pointer to a managed 8-bit unsigned integer array.
Marshal.Copy(dataSizesPtr, dataSizesArray, 0, dataSizesArray.Length);
var levelSize = 0;
byte[] levelData = new byte[0];
for (int x = 0; x < mipLevels; x++)
{
levelSize = dataSizesArray[x];
levelData = new byte[levelSize];
Marshal.Copy(texDataPtr, levelData, 0, levelSize);
texDataPtr = IntPtr.Add(texDataPtr, levelSize);
}
return levelData;
}
[DllImport(“x86/pvrtc.dll”,CallingConvention=CallingConvention.StdCall)]
私有静态外部IntPtr CompressTexture(字节[]数据、int高度、int宽度、int miplavels、bool预乘、bool pvrtc4bppc压缩、ref IntPtr数据大小);
公共静态字节[]压缩(字节[]数据、int高度、int宽度、int miplavels、bool预乘、bool pvrtc4bppCompression)
{
IntPtr dataSizesPtr=Marshal.allocTaskMem(data.Length+1);
var texDataPtr=压缩纹理(数据、高度、宽度、mipLevels、预乘、pvrtc4bppCompression、ref dataSizesPtr);
//存储每个级别的大小
var DataSizeArray=新的整数[mipLevels];
//将数据从非托管内存指针复制到托管8位无符号整数数组。
复制(dataSizesPtr,dataSizesArray,0,dataSizesArray.Length);
var-levelSize=0;
字节[]levelData=新字节[0];
对于(int x=0;x<0;x++)
{
levelSize=DataSizeArray[x];
levelData=新字节[levelSize];
封送处理副本(texDataPtr,levelData,0,levelSize);
texDataPtr=IntPtr.Add(texDataPtr,levelSize);
}
返回数据;
}
非常感谢您的帮助。具体在哪一行?在var texDataPtr=CompressTexture(数据、高度、宽度、mipLevels、预乘、pvrtc4bppCompression、ref dataSizesPtr);所以我认为是intPtr。