.net使用Com组件的问题
前段时间,在.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就存在一些问题了。
今天在使用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就存在一些问题了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通