在混合代码中查找访问冲突的来源

时间:2017-12-14 16:36:11

标签: c# sharpdx wic

我得到了以下代码(使用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是按时间顺序调用的完整来源。

1 个答案:

答案 0 :(得分:0)

我的猜测是有些数字与指针混淆了。查看它试图访问的内存地址:

  • 0x0000000000000008
  • 0xFFFFFFFFFFFFFFFF

整数形式,这些是8和-1,所以如果代码中有人,你传递的数值是API期望IntPtr等等,我不会感到惊讶。我无法访问您正在使用的特定库,但我会仔细查看参数类型是什么,并确保您没有传递它不期望的东西(或者是否有你传递的值为-1或8的任何地方。)