ArcEngine中对象不能及时释放资源的错误

ArcEngine 中存在一些错误。其中最有名的就是对象不能释放资源的问题。
比如打开了一个Shapefile ,除非程序关闭否则就没有办法释放对Shapefile的控制
还有读取ServerStyle文件的时候那个StyleItemEnum只能使用一次。第二次就会出错,
如果在短时间内搜索多个FeatureClass这样就会产生多个FeatureCursor,那么就会出现
打开的游标数目过多或者不能打开更多的表这样的错误。
这些错误都是由于对象不能释放资源所造成的。
可以使用以下方法来释放(C#):
//其中relObj就是要释放的对象。
System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj);
如果要确保被释放了。那么可以循环调用该方法 直到这个方法返回0为止。

 

 

ArcEngine添加图层时,内存释放问题备注

 

ArcEngine自定义方法添加图层时,内存无法释放,而且关闭主控程序后,内存管理器中一直驻留EXE。

1. 命令方式:

           ControlsAddDataCommandClass command = new ControlsAddDataCommandClass();
            command.OnCreate(m_mapControl.Object);
            command.OnClick();

2. 手工方式:

  /////////////////加载图层并设置图层样式
 IWorkspaceFactory pWSFactory = new AccessWorkspaceFactoryClass();
 IWorkspace pWorkspace = pWSFactory.OpenFromFile(AppProperty.gcMDBPath, 0);
 IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;
 IFeatureClass pFeatureClass = pFWS.OpenFeatureClass("工程");
 IFeatureLayer pFeatureLayer = new FeatureLayerClass();
 pFeatureLayer.Name = "工程";
 pFeatureLayer.FeatureClass = pFeatureClass;
 IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)pFeatureLayer;
 ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
 simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSCross;
 ILineSymbol outLineSymbol = new SimpleLineSymbolClass();
  outLineSymbol.Width = 1;
  outLineSymbol.Color = GetColor(140, 140, 140, 100);
 simpleFillSymbol.Outline = outLineSymbol;
 simpleFillSymbol.Color = GetColor(140, 140, 140, 100);
 ISimpleRenderer simpleRender = new SimpleRendererClass();
 simpleRender.Symbol = simpleFillSymbol as ISymbol;
 pGeoFeatureLayer.Renderer = simpleRender as IFeatureRenderer;
  _mapControl.Map.AddLayer(pGeoFeatureLayer);

 

 

彻底的释放也不管用。

 System.Runtime.InteropServices.Marshal.ReleaseComObject(pFWS);
 System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspace);
 System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSFactory);

  IMapControl3 _mapControl = (IMapControl3)axMapControlGHT.Object;
    for (int i = 0; i < _mapControl.Map.LayerCount; i++)
     {
         System.Runtime.InteropServices.Marshal.ReleaseComObject(_mapControl.Map.get_Layer(i));
      }

 

 

******************************************************

无奈采用强制关闭EXE的方法释放内存

原文:http://kenter1643.javaeye.com/blog/451973

 

主程序Program.cs代码

  1. static class Program   
  2.     {   
  3.         /// <summary>   
  4.         /// 应用程序的主入口点。   
  5.         /// </summary>   
  6.         [STAThread]   
  7.         static void Main()   
  8.         {   
  9.             Application.EnableVisualStyles();   
  10.             Application.SetCompatibleTextRenderingDefault(false);   
  11.             Application.Run(new MainForm());   
  12.             //强制关闭进程   
  13.             string exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;   
  14.             string[] exeArray = exeName.Split('//');   
  15.   
  16.             FunctionClass.RunCmd("taskkill /im " + exeArray[exeArray.Length-1] + " /f ");   
  17.         }   
  18.     }  

强制关闭方法:

 

  1. /// <summary>   
  2.         /// 运行DOS命令   
  3.         /// DOS关闭进程命令(ntsd -c q -p PID )PID为进程的ID   
  4.         /// </summary>   
  5.         /// <param name="command"></param>   
  6.         /// <returns></returns>   
  7.         public static string RunCmd(string command)   
  8.         {   
  9.             //實例一個Process類,啟動一個獨立進程   
  10.             System.Diagnostics.Process p = new System.Diagnostics.Process();   
  11.   
  12.             //Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,下面我們用到了他的幾個屬性:   
  13.   
  14.             p.StartInfo.FileName = "cmd.exe";           //設定程序名   
  15.             p.StartInfo.Arguments = "/c " + command;    //設定程式執行參數   
  16.             p.StartInfo.UseShellExecute = false;        //關閉Shell的使用   
  17.             p.StartInfo.RedirectStandardInput = true;   //重定向標準輸入   
  18.             p.StartInfo.RedirectStandardOutput = true;  //重定向標準輸出   
  19.             p.StartInfo.RedirectStandardError = true;   //重定向錯誤輸出   
  20.             p.StartInfo.CreateNoWindow = true;          //設置不顯示窗口   
  21.   
  22.             p.Start();   //啟動   
  23.   
  24.             //p.StandardInput.WriteLine(command);       //也可以用這種方式輸入要執行的命令   
  25.             //p.StandardInput.WriteLine("exit");        //不過要記得加上Exit要不然下一行程式執行的時候會當機  
  26.   
  27.             return p.StandardOutput.ReadToEnd();        //從輸出流取得命令執行結果   
  28.   
  29.         }  
posted @ 2012-04-09 17:12  LinHugh  阅读(1932)  评论(0编辑  收藏  举报