“外部组件引发的异常。”调用WicRenderTarget时出现异常

时间:2017-06-15 14:58:30

标签: c# sharpdx unresolved-external

被调用的代码:

try
{
    renderBitmap = new WicRenderTarget(DXManager.Factory, host.bmp, new RenderTargetProperties());
}
catch (Exception ex)
{
    // Exists entirely so that we can set a break point to catch this on the Exception.
    throw ex;
}

host.bmp 是SharpDX.WIC.Bitmap。我们偶尔会得到上面提到的“外部组件已经抛出异常”。异常,错误代码为“-2147467259”(映射到0x80004005或“未指定的错误”)和以下堆栈跟踪:

at SharpDX.Direct2D1.Factory.CreateWicBitmapRenderTarget(Bitmap target, RenderTargetProperties& renderTargetProperties, RenderTarget renderTarget)
   at SharpDX.Direct2D1.WicRenderTarget..ctor(Factory factory, Bitmap wicBitmap, RenderTargetProperties renderTargetProperties)
   at MyCompany.Framework.DirectX.DXRenderableImage.Surface..ctor(DXRenderableImage Target, PointF NewOrigin, Color BackgroundColor) in Source ....\\Framework\\DirectX\\DXImageSurface.cs:line 150

DXRenderableImage.Surface构造函数的代码是问题顶部提到的代码,它基本上只调用WicRenderTarget构造函数。

据我所知,工厂很好。当我们快速连续处理相当复杂的页面时,会发生此异常,从而生成用于保存页面的预览缩略图。我们的线程保存逻辑应该一次只调用一次,所以这应该是门控的。这可能与难以获得渲染锁定有关(我们已经在类似情况下看到了不同的例外情况)。

我对如何进行调试感到困惑。该例外没有任何支持信息,否则一切似乎都是有序的。有没有人要么对我有答案,要么找到解决方法?

2 个答案:

答案 0 :(得分:1)

我将此作为答案而不是评论重新发布。

<强>首先 0x80004005错误通常表示访问被拒绝/锁定情况。你认为你正在加载的图像(host.bmp)可能被锁定在两个线程之间吗?你检查过你的方法是否是线程安全的吗?你应该在将它们读入内存后释放任何已加载的图像。

<强>其次 你可能没有得到内部异常,因为你使用“throw ex”来重新抛出异常会占用你的堆栈跟踪。最好只使用“throw”来保留堆栈跟踪。

答案 1 :(得分:0)

使用完毕后,您是否尝试过处置物品?这可能是内存泄漏。您可以在try / catch中添加finally块并在其中调用Dispose()

finally
{
    renderBitmap.Dispose();
}

或使用

using (renderBitmap = new WicRenderTarget(DXManager.Factory, host.bmp, new RenderTargetProperties()))
{
    // do the stuff you want with the render-bitmap
}