欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏SuperMap应用与开发超图桌面 → 正文
vs.net中使用SuperMap需要注意的问题
07-10-08 15:56:58 作者:supermapxll 出处:www.gisforum.net
.net中使用com对象,使用后必须通过如下代码释放:
比如定义的solayer类型的变量objlayer
System.Runtime.InteropServices.Marshal.ReleaseComObject(objlayer);
objlayer=null;
如果接口返回值也是一个com对象的话,也必须定义一个变量来接收,然后释放:
比如:
object handle;
handle=superworkspace1.CtlHandle();
supermap1.Connect(handle);
System.Runtime.InteropServices.Marshal.ReleaseComObject(handle);
handle=null;

在.NET中,当调用unmanaged COM组件的时候,它实际上是间接地通过RCW(Runtime Callalbe Wrapper)进行的,所以,我们在调用的时候,要遵循一些规范。对于从unmanaged COM组件返回的对象,我们要对其调用System.Runtime.InteropServices.Marshal.ReleaseComObject()方法并将其设为null,才能将其正确释放,并保证其正常运作。特别是,对于一些隐含返回的对象,也要这样调用。有三种典型的用法需要注意。

1,普通使用
SuperMapLib.soStyle objStyle;
objStyle = new SuperMapLib.soStyle
..//use this object

System.Runtime.InteropServices.Marshal.ReleaseComObject(objStyle);
objStyle = null;

2,中间临时对象


SuperMapLib.soDataSource soDs;
SuperMapLib.soDataset sodt;
...//get datasource

..//get dataset
//sodt = soDs.Datasets[1]; 这种写法不对
//正确的写法是:
SuperMapLib.soDatasets sodts;
sodts = soDs.Datasets;
sodt = sodts[1];


// ... use dataset

//release objects now.
System.Runtime.InteropServices.Marshal.ReleaseComObject(sodt);
sodt = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject(sodts);
sodts = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject(soDs);
soDs = null;

原因是这个soDatasets对象也已经隐含的被放到manager code中了,如果没有调用
System.Runtime.InteropServices.Marshal.ReleaseComObject()方法,这些对象将停
留在.net运行空间内,.net的垃圾收集器会多次去回收她。


3,返回型临时变量

这种类型的一个典型调用是soLayers.AddDataset()方法。

根据上面第二点,我们先得到soLayers;
SuperMapLib.soLayers objLayers;
objLayers = axSuperMap1.Layers;

SuperMapLib.soDataset objdt;

//...get the dataset
//objdt = ...

//这种写法不对: objLayers.AddDataset(objdt,true);
//正确的写法是:
SuperMapLib.soLayer tempLayer;
tempLayer = objLayers.AddDataset(objdt,true);

System.Runtime.InteropServices.Marshal.ReleaseComObject(tempLayer);
tempLayer = null;

原理与第二点差不多,因为已经有一个soLayer被隐含的放在.net运行空间中了,需要
显式的释放它。

更多的详细信息,可以参考msdn中System.Runtime.InteropServices.Marshal.ReleaseComObject()方法的说明。
大家可能感到这样使用不太方便,但目前确实需要这样编写才能够在.net中使用。这个也不是SuperMap Objects特有的问题,所有的COM对象都有相同的特点要求。我们衷心的希望微软能够改进垃圾回收器,更加智能的帮助开发人员释放对象。
(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号