C# 调用本机方法时的最大缓冲区大小

C# 调用本机方法时的最大缓冲区大小,c#,interop,bytearray,C#,Interop,Bytearray,我有一个C#程序使用p/Invoke调用现有的C映像库DLL 缓冲区的大小是否可能有限制,无法有效编组 我正在调用一个函数,其中我将指针传递给InputBuffer、其大小和OutputBuffer,如下所示: cmsDoTransform(xform, inputBitmapBytesRGB, outputBitmapBytesCMYK, TotalPixels); 在试验这段代码时,我一直收到MemoryAccessViolation错误 因此,我开始使用1x1像素、2x2、4x4、8x8

我有一个C#程序使用p/Invoke调用现有的C映像库DLL

缓冲区的大小是否可能有限制,无法有效编组

我正在调用一个函数,其中我将指针传递给InputBuffer、其大小和OutputBuffer,如下所示:

cmsDoTransform(xform, inputBitmapBytesRGB, outputBitmapBytesCMYK, TotalPixels);
在试验这段代码时,我一直收到MemoryAccessViolation错误

因此,我开始使用1x1像素、2x2、4x4、8x8、16x16到64x64的非常小的RGB图像,所有这些都正常工作,突然之间,没有更多的错误消息。再高兴不过了

自信地,我回到了我原来的364x288像素的RGB测试图像。那没用?返回MemoryAccessViolations

因此,我将图像大小从364x288减小到288x288,再减小到256x256,直到它“通过”,达到128x128,结果图像大小为49512字节

因此,上述函数调用中的TotalPixels参数变为128x128或16384。它似乎是关于.NET封送处理程序将接受作为缓冲区大小的“最大”数?这有意义吗

在.NET中,有没有一个上限是我在做的普通图像处理中无法超越的?

我脸上的鸡蛋

原来我设置的缓冲区大小不正确

我使用的代码是:

Byte[] Input = new byte[1024];
Byte[] Output = new byte[1024];
UInt32 pixels = 1024;    
cmsDoTransform(xform, Input, Output, pixels);
Byte[] Input = new byte[1024 x 3]; // To allow for RGB = 3 bytes/pixel
Byte[] Output = new byte[1024 x 4]; // To allow for CMYK = 4 bytes/pixel
UInt32 pixels = 1024; // Correct number of pixels
cmsDoTransform(xform, Input, Output, pixels);
当我应该使用此代码时:

Byte[] Input = new byte[1024];
Byte[] Output = new byte[1024];
UInt32 pixels = 1024;    
cmsDoTransform(xform, Input, Output, pixels);
Byte[] Input = new byte[1024 x 3]; // To allow for RGB = 3 bytes/pixel
Byte[] Output = new byte[1024 x 4]; // To allow for CMYK = 4 bytes/pixel
UInt32 pixels = 1024; // Correct number of pixels
cmsDoTransform(xform, Input, Output, pixels);

我完全错过了这个重要的区别,浪费了几天时间寻找我的错误。我建议开发人员考虑在未来的文档中添加一些代码片段…

确保字节[]的索引是一个ULUN而不是一个整数。