华夏土地

查看完整版本: vs.net中使用SuperMap需要注意的问题

kkriven 2006-6-27 13:27

vs.net中使用SuperMap需要注意的问题

  <P>&#46;net中使用com对象,使用后必须通过如下代码释放:<BR>比如定义的solayer类型的变量objlayer<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(objlayer);<BR>objlayer=null;<BR>如果接口返回值也是一个com对象的话,也必须定义一个变量来接收,然后释放:<BR>比如:<BR>object handle;<BR>handle=superworkspace1&#46;CtlHandle();<BR>supermap1&#46;Connect(handle);<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(handle);<BR>handle=null;</P>
<P>补充在&#46;NET中,当调用unmanaged COM组件的时候,它实际上是间接地通过RCW(Runtime Callalbe Wrapper)进行的,所以,我们在调用的时候,要遵循一些规范。对于从unmanaged COM组件返回的对象,我们要对其调用System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject()方法并将其设为null,才能将其正确释放,并保证其正常运作。特别是,对于一些隐含返回的对象,也要这样调用。有三种典型的用法需要注意。<BR>1,普通使用<BR>SuperMapLib&#46;soStyle objStyle;<BR>objStyle = new SuperMapLib&#46;soStyle<BR>&#46;&#46;//use this object<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(objStyle);<BR>objStyle = null;<BR>2,中间临时对象<BR>SuperMapLib&#46;soDataSource soDs;<BR>SuperMapLib&#46;soDataset sodt;<BR>&#46;&#46;&#46;//get datasource<BR>&#46;&#46;//get dataset <BR>//sodt = soDs&#46;Datasets[1];&nbsp;&nbsp;这种写法不对<BR>//正确的写法是:<BR>SuperMapLib&#46;soDatasets sodts;<BR>sodts = soDs&#46;Datasets;<BR>sodt = sodts[1];<BR>// &#46;&#46;&#46; use dataset<BR>//release objects now&#46;<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(sodt);<BR>sodt = null;<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(sodts);<BR>sodts = null;<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(soDs);<BR>soDs = null;<BR>原因是这个soDatasets对象也已经隐含的被放到manager code中了,如果没有调用<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject()方法,这些对象将停<BR>留在&#46;net运行空间内,&#46;net的垃圾收集器会多次去回收她。<BR>3,返回型临时变量<BR>这种类型的一个典型调用是soLayers&#46;AddDataset()方法。<BR>根据上面第二点,我们先得到soLayers;<BR>SuperMapLib&#46;soLayers objLayers;<BR>objLayers = axSuperMap1&#46;Layers;<BR>SuperMapLib&#46;soDataset objdt;<BR>//&#46;&#46;&#46;get the dataset<BR>//objdt = &#46;&#46;&#46;<BR>//这种写法不对: objLayers&#46;AddDataset(objdt,true);<BR>//正确的写法是:<BR>SuperMapLib&#46;soLayer tempLayer;<BR>tempLayer = objLayers&#46;AddDataset(objdt,true);<BR>System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject(tempLayer);<BR>tempLayer = null;<BR>原理与第二点差不多,因为已经有一个soLayer被隐含的放在&#46;net运行空间中了,需要<BR>显式的释放它。<BR>更多的详细信息,可以参考msdn中System&#46;Runtime&#46;InteropServices&#46;Marshal&#46;ReleaseComObject()方法的说明。<BR>大家可能感到这样使用不太方便,但目前确实需要这样编写才能够在&#46;net中使用。这个也不是SuperMap Objects特有的问题,所有的COM对象都有相同的特点要求。</P>

ahdzhj 2006-9-5 23:42

增长知识。

seamo12345 2006-11-14 14:58

谢谢指点了,有增长了知识:lol
页: [1]
查看完整版本: vs.net中使用SuperMap需要注意的问题