惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
N
News and Events Feed by Topic
S
Schneier on Security
G
GRAHAM CLULEY
Scott Helme
Scott Helme
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
Cisco Talos Blog
Cisco Talos Blog
P
Privacy & Cybersecurity Law Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 司徒正美
Blog — PlanetScale
Blog — PlanetScale
Project Zero
Project Zero
MyScale Blog
MyScale Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
The Last Watchdog
The Last Watchdog
Vercel News
Vercel News
The Cloudflare Blog
C
Check Point Blog
Help Net Security
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
NISL@THU
NISL@THU
S
Security @ Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
SegmentFault 最新的问题
MongoDB | Blog
MongoDB | Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
AWS News Blog
AWS News Blog
Cloudbric
Cloudbric
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
S
Securelist
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
S
Secure Thoughts

博客园 - wljcan

用户中心 - 博客园 FMEFB开始上传 代码实现的事件响应 UIAlertView的使用方法 开始新的学习历程--ios开发 nod32 制作的手机电子书UMD文件编辑器 关于IOC 精彩的讨论《数据库时代的终结 》 Oracle开发中,关于查询的一个问题 使用NHibernate时需要考虑的另一个问题 关于crystal report和NHibernate应用的一个问题 使用NHibernate时,如何提高访问Oracle数据库(ODP.net)的性能 在Google 上搜书的方法 (转) - wljcan 一个NHibernate的好工具---Query Analyzer 在PowerDesigner中生成SQL脚本时,如何生成备注信息? 北京公司招聘 .net开发人员 ArrayList中的排序 应用中的安全管理方案
.net使用Com组件的问题
wljcan · 2005-02-07 · via 博客园 - wljcan

前段时间,在.net中使用Supermap组件(activeX)时,发现经常出现内存不能写的异常,后来与超图公司联系,说是需要在代码中释放Com对象才可以。
今天在使用MapX组件时,又发现一个比较奇怪的问题:在处理拓朴关系时,处理部分数据后,出现NullReferenceException异常。代码如下所示:

 for (int i=1;i<=axMap1.Layers[LayerName].AllFeatures.Count;i++)
{
    MapXLib.Feature ft=axMap1.Layers[LayerName].AllFeatures[i];
    x1 =  ft.Parts[1].get_X(1) ;
    y1 =  ft.Parts[1].get_Y(1);
    ProcessData(x1,y1);
}
查了半天,也没有找到原因所在,后来想到可能与Com对象的释放有关,于是将代码调整为:
MapXLib.Layer lay=axMap1.Layers[LayerName];
MapXLib.Features fs= lay.AllFeatures;
int c=fs.Count;
for (int i=1;i<=c;i++)
{
    MapXLib.Feature ft=fs._Item(i);
    MapXLib.Parts pts=ft.Parts;
    MapXLib.Points pss=pts [1];
    x1 =  pss.get_X(1) ;
    y1 =  pss.get_Y(1);
    ProcessData(x1,y1);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(pss);
    pss=null;
    System.Runtime.InteropServices.Marshal.ReleaseComObject(pts);
    pts=null;
    System.Runtime.InteropServices.Marshal.ReleaseComObject(ft);
    ft=null;
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(fs);
fs=null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(lay);
lay=null;

调整后的代码运行正常。

在调整期间发现几个值得注意的地方:
1、只要是定义了Com对象,在使用完之后必须释放,否则,多次调用后,将出现问题。
2、中间临时变量也需要释放,如将
    x1 =  ft.Parts[1].get_X(1) ;
    折为
    MapXLib.Parts pts=ft.Parts;
    MapXLib.Points pss=pts [1];
    x1 =  pss.get_X(1) ;
    y1 =  pss.get_Y(1);
    再释放变量。
3、如果某方法返回了Com对象,则需要定义返回的变量,然后将其释放。

另外,发现使用FireFox浏览器时,博客圆的浏览和编辑blog就存在一些问题了。