我得到了以下代码(使用SharpDX.WIC / SharpDX.Direct3D11),它总是抛出异常,说有访问冲突。
public static SharpDX.Direct3D11.Texture2D CreateTexture2DFromBitmap(SharpDX.Direct3D11.Device device, BitmapSource bitmapSource)
{
// Allocate DataStream to receive the WIC image pixels
int stride = PixelFormat.GetStride(bitmapSource.PixelFormat, bitmapSource.Size.Width);
using (var buffer = new DataStream(bitmapSource.Size.Height * stride, true, true))
{
// Copy the content of the WIC to the buffer
bitmapSource.CopyPixels(stride, buffer);
return new SharpDX.Direct3D11.Texture2D(device, new SharpDX.Direct3D11.Texture2DDescription()
{
Width = bitmapSource.Size.Width,
Height = bitmapSource.Size.Height,
ArraySize = 1,
BindFlags = SharpDX.Direct3D11.BindFlags.ShaderResource,
Usage = SharpDX.Direct3D11.ResourceUsage.Default,
CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
MipLevels = 1,
OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None,
SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
}, new DataRectangle(buffer.DataPointer , stride));
}
}
异常消息是:
MyApp.exe中的0x00007FF894ECA25C(combase.dll)抛出异常:0xC0000005:访问冲突写入位置0x0000000000000008。
编辑:有时我会收到此异常:
MyApp.exe中0x00007FF8825283BD(WindowsCodecs.dll)抛出异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。
它出现在这一行:
bitmapSource.CopyPixels(stride, buffer);
我在某处读到FormatConverter
需要所有组件,因此在复制到缓冲区之前处置它们会导致无效读取。之后它起作用了,但后来没有任何有意义的理由再次破产。现在我总是得到这种写入访问冲突,我无法找到源。
我试图通过反汇编找出它发生的位置,但我不清楚0xC0000005
所在的位置。毕竟我不知道为什么这不起作用。这个代码来自较旧的SharpDX示例代码,即使在Stackoverflow上也已经引用了很多代码。但它根本不起作用。基础FileStream
具有 ReadWrite -access,DataStream
设置为允许读写操作。
这可能是SharpDX.WIC代码库中的一个问题吗?
为了保持简洁和方便,here是按时间顺序调用的完整来源。
答案 0 :(得分:0)
我的猜测是有些数字与指针混淆了。查看它试图访问的内存地址:
整数形式,这些是8和-1,所以如果代码中有人,你传递的数值是API期望IntPtr等等,我不会感到惊讶。我无法访问您正在使用的特定库,但我会仔细查看参数类型是什么,并确保您没有传递它不期望的东西(或者是否有你传递的值为-1或8的任何地方。)