版本:ArcGIS 10
AOUninitialize.Shutdown
由ArcGIS Engine开发的独立运行的应用,由于它包含了一个加载地图文档的MapControl控件,在推出程序时可能会遇到如下错误:"The instruction x references memory at x. The memory could not be read.”。这可能是由于COM对象残留在内存中,导致COM库无法从进程退出的结果。为避免该错误,可以使用ESRI.ArcGIS.ADF.Local程序集中的Shutdown静态方法,该方法确保在进程关闭之前卸载所有未使用的COM引用。可以在窗口(Form)控件的Disposed事件触发该方法:
[C#]
private void Form1_Disposed(object sender, System.EventArgs e)
{
ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown();
}
ComReleaser class
ComReleaser类可以管理COM对象,确保代码执行完后释放COM,该类位于ESRI.ArcGIS.ADF.Connection.Local程序集中。ComReleaser类使用ReleaseCOMObjects方法释放COM对象,该方法只有在COM不再被托管代码使用时才调用。
Marshal.ReleaseComObject
.NET托管代码通过RCW对COM对象进行访问,托管代码被垃圾回收器自动回收。而COM对象在使用过程中会占用系统资源,比如文件控制、数据库连接等,这会导致很多错误,因此必须精确的释放特定的COM对象,从而释放系统资源。调用ReleaseComObject方法可以减少RCW对COM对象的引用计数,当引用计数减少为0时,RCW被标识为垃圾集。
调用ReleaseComObject会影响进程中所有对COM对象的引用。因此在进程内组件(比如加载到ArcGIS Desktop的态连接库DLL)中调用此方法,要特别小心。当多个组件同时对COM引用时,不要企图调用ReleaseComObject方法,例如一个组件保存了对MxDocument的引用,而且调用了ReleaseComObject方法,那么其他组件都不能访问到MxDocument对象。 |
以下代码显示通过ReleaseComObject方法释放StyleGallery对象:
[C#]
private void MyFunction()
{
ESRI.ArcGIS.Display.IStyleGallery styCls = new
ESRI.ArcGIS.Framework.StyleGalleryClass()as
ESRI.ArcGIS.Display.IStyleGallery;
// Use the StyleGalleryClass here.
int refsLeft = 0;
do
{
refsLeft = Marshal.ReleaseComObject(styCls);
}
while (refsLeft > 0);
}