为什么System.Drawing.Drawing2D.Matrix派生自MarshalByRefObject?

时间:2012-10-08 16:46:10

标签: .net matrix marshalbyrefobject drawing2d

为什么Matrix是一个来自MarshalByRefObject而不是轻量级结构的重量级类?

3 个答案:

答案 0 :(得分:3)

Matrix class实际上是由GDI+ Flat API操纵的非托管结构的包装器。

尽管如此,System.Drawing namespace中的类通常MarshalByRefObject class派生IDisposable implementation以方便GDI functions,并且在使用时自动封送应用程序域边界在Remoting。

这很可能是因为大多数{{3}}(Windows窗体控件所依赖的大多数API)将使用GDI矩阵进行转换;使用轻量级,完全托管的代码结构,每次调用方法时都需要在托管/非托管边界上转换该结构。

与只调用调用和句柄的成本相比,只要你想对矩阵进行操作,就调用和整个结构,可能由于性能原因而决定最好整理调用。< / p>

答案 1 :(得分:1)

由于通常的原因,它是一个非托管对象。它也有一个终结器,以防您忘记丢弃。

GDI +的核心是原生api。 C ++程序的相应标题是<gdiplus.h>,您可以在Windows SDK包含目录中找到它。本机Matrix类is here的MSDN Library文章。

答案 2 :(得分:0)

根据该方法的MSDN文档:

  

调用Dispose允许此Matrix对象使用的资源   为其他目的重新分配。

快速查看反射器会显示以下代码:

private void Dispose(bool disposing)
{
  if (!(this.nativeMatrix != IntPtr.Zero))
    return;
  SafeNativeMethods.Gdip.GdipDeleteMatrix(new HandleRef((object) this, this.nativeMatrix));
  this.nativeMatrix = IntPtr.Zero;
}