为什么从轻量级结构Matrix
派生出重量级类?MarshalByRefObject
问问题
440 次
3 回答
3
该类实际上是由GDI+ Flat API操作的非托管结构Matrix
的包装器。
也就是说,System.Drawing
命名空间中的类通常从MarshalByRefObject
类派生以方便IDisposable
实现,并在 Remoting 中使用时跨应用程序域边界进行自动编组。
这很有可能是因为大多数GDI 函数(Windows 窗体控件所依赖的大多数 API)将使用 GDI 矩阵进行转换;使用轻量级、完全托管的代码结构将需要在每次调用方法时跨托管/非托管边界转换该结构。
与仅对调用和句柄进行编组的成本相比,与每当您想对矩阵进行操作时调用和整个结构的成本相比,出于性能原因,可能决定对调用进行编组更好。
于 2012-10-08T16:56:32.857 回答
1
由于通常的原因,它是一个非托管对象。它也有一个终结器,以防你忘记处理。
GDI+ 的核心是原生 api。C++ 程序的相应头文件是<gdiplus.h>
,您可以在 Windows SDK 包含目录中找到它。本机 Matrix 类的 MSDN 库文章在此处。
于 2012-10-08T16:59:15.057 回答
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;
}
于 2012-10-08T16:50:32.607 回答