如何才能杀死指定的进程,也就是我之前用程序打开excel文件时启动的进程,我现在程序里好多个excel.exe.程序打开几次Excel就有几个exe进程。下面的方法把所有的excel进程全都杀死了,包括我打开的其他的excel文件随之被关闭,所以我现在想
有没有一种方法可以杀死指定的进程,而不是一个不留,把excel进程全杀了。各位帮帮忙!
GC.Collect();   
  System.Diagnostics.Process[]   myProcesses   ;   
  myProcesses   =   System.Diagnostics.Process.GetProcessesByName("EXCEL");   
  foreach(System.Diagnostics.Process   myProcess   in   myProcesses)   
  {   
  myProcess.Kill();   
  }

解决方案 »

  1.   

      //IntPtr t = new IntPtr(app.Hwnd);
                //int m = 0;
                //GetWindowThreadProcessId(t, out m);
                //Process p = Process.GetProcessById(m);
                //p.Kill();
            [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, out   int ID);
      

  2.   

    http://topic.csdn.net/u/20081129/10/8af89006-00d8-42e1-90d9-8bb5da962ee3.html
    找我的回复
      

  3.   

    用杀死进程的方法结束excel不是什么好办法,是比较另类的做法,而且有可能发生不可预知的后果,最好是用微软说的办法
    // 这里只贴了退出代码    FreeExcelObject(ExcelWorksheet);
        ExcelWorkbook.Close(Missing.Value, Missing.Value, Missing.Value); // 我用的是office 2003
        FreeExcelObject(ExcelWorkbook);
        FreeExcelObject(ExcelWorkbooks);
        ExcelApplication.Quit();
        FreeExcelObject(ExcelApplication);      
            // 我是参照着msdn上微软的推荐做法 
            #region void FreeExcelObject(Object Obj) // 释放Excel对象
             /// <summary>
            /// 释放Excel对象
             /// </summary>
            /// <param name="Obj">Excel对象</param>
            void FreeExcelObject(Object Obj)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(Obj);
                }
                catch
                {
                }
                finally
                {
                    Obj = null;
                }
            }
            #endregion
      

  4.   

    这个问题我几个月之前就碰到过,将所有用过的excel对象全部设置为NULL,然后再用垃圾回收GC.Collect()就行了。这样的话,是否手动关掉excel最终进程也不了驻留
      

  5.   

    public void KillExcelProcess()
    {
    Process[] myProcesses;
    DateTime startTime;
    myProcesses = Process.GetProcessesByName("Excel"); //得不到Excel进程ID,暂时只能判断进程启动时间
    foreach(Process myProcess in myProcesses)
    {
    startTime = myProcess.StartTime; if(startTime > beforeTime && startTime < afterTime)
    {
    myProcess.Kill();
    }
    }
    }
    private void Dispose()
    {
    workBook.Close(null,null,null);
    app.Workbooks.Close();
    app.Quit(); if(range != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
    range = null;
    }
    if(range1 != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
    range1 = null;
    }
    if(range2 != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range2);
    range2 = null;
    }
    if(textBox != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(textBox);
    textBox = null;
    }
    if(workSheet != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
    workSheet = null;
    }
    if(workBook != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
    workBook = null;
    }
    if(app != null)
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
    app = null;
    } GC.Collect(); this.KillExcelProcess();
      

  6.   

     private static void KillProcess()
            {
                System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");
                System.DateTime startTime = new DateTime();
                int m, killId = 0;
                for (m = 0; m < excelProc.Length; m++)
                {
                    if (startTime < excelProc[m].StartTime)
                    {
                        startTime = excelProc[m].StartTime;
                        killId = m;
                    }
                }
                if (excelProc[killId].HasExited == false)
                {
                    excelProc[killId].Kill();
                }
            }
    在excel执行完以后,直接调用这个方法就OK了
      

  7.   

    附上MSDN原文章
    使用 Visual Studio .NET 客户端执行自动化功能后不退出 Office 应用程序
    http://support.microsoft.com/kb/317109/zh-cn
      

  8.   

    就如文章所示,除了要用System.Runtime.InteropServices.Marshal.ReleaseComObject来减少引用计数外
    每个对象都需要存给新变量并在退出时对他们进行引用计数的减少工作后设置null要确保退出 Office 应用程序,自动化代码一定要满足以下条件:
    将每个对象声明为新变量。例如,将下面的代码行
    oBook = oExcel.Workbooks.Add()
    更改为以下内容:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    停止使用某个对象时,应使用 System.Runtime.InteropServices.Marshal.ReleaseComObject。这样可以减少 RCW 的引用计数。
    要释放对变量的引用,请将变量设置为等于 Nothing 或 Null。
    使用 Office 应用程序对象的 Quit 方法通知服务器关闭。
      

  9.   

    根本就不用杀进程.
    GC.Collect(); 这个完全可以释放比如说你操作excel的方法为  void DoAction();DoAction();
    GC.Collect();//把这行写在DoAction方法调用之后,放到DoAction方法里边没用
      

  10.   

    举例:public void Process(string xlsPath)
    {
     Excel.Application excelApp = null;
     private object MISSING_OBJECT = Type.Missing;
                try
                {
                    excelApp = new Excel.ApplicationClass();
                    excelApp.DisplayAlerts = false;                excelApp.Workbooks.Open(xlsPath,
                                            2,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT,
                                            MISSING_OBJECT);
                    workBook = excelApp.Workbooks[1];
                       .......
                       ..........
                }
                catch
                {
                    throw;
                }
                finally
                {
                    excelApp.Quit();
                }
    }调用:Process(....);
    GC.Collect();
    GC.WaitForPendingFinalizers();
      

  11.   

    上例中以下语句写到方法外面..我放错地了-_-!!
    private object MISSING_OBJECT = Type.Missing;
      

  12.   

    多余。楼主按照以下方法,便可将每次open Excel后,在这个过程产生的Excel进程清除。(必须用两个函数调用,才可以实现。)
    button_OpenExcel_Click
    {
    open();
    }open()
    {
     try
     {
       OpenExcel();
     }
    finlly
     {
       GC.Collect(); 
     }
    }OpenExcel()
    {
      //Open Excel Code
    }
      

  13.   

    fghfg