在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式。請確保您的 Main 函數帶有 STAThreadAttribute 標記。 只有將調試器附加到該進程才會引發此異常。 程序之前運行正常,我只是在一個事件中定義了做了如下操作,程序拋出此異常 private void OnExportPlan(object sender, EventArgs e) { try { if (null != ExportPlan) { Cursor = Cursors.WaitCursor; saveFileDialog1.Filter = "(Excel2003).xls|*.xls|(Excel2007).xlsx|*.xlsx"; if (DialogResult.OK == saveFileDialog1.ShowDialog()) { mExportFilePath = saveFileDialog1.FileName; Application.DoEvents(); ExportPlan(this, null); } } } finally { Cursor = Cursors.Default; } } 查看MSDN,有如下說明: 單元是進程內部具有相同線程訪問要求的對象的邏輯容器。同一單元中的所有對象都可以接收從該單元中的任何線程發出的調用。.NET Framework 不使用單元,托管對象自己負責以線程安全的方式使用所有共享資源。 由於 COM 類使用單元,因此公共語言運行庫需要在 COM interop 的情況下調用 COM 對象時創建並初始化一個單元。托管線程可以創建並進入只允許有一個線程的單線程單元 (STA) 或者包含一個或多個線程的多線程單元 (MTA)。通過將線程的 ApartmentState 屬性設置為 ApartmentState 枚舉值之一,可以控制所創建的單元的類型。由於給定線程只能初始化 COM 單元一次,因此在第一次調用非托管代碼之后就不能更改單元類型。 成員定義: STA:Thread 將創建並進入一個單線程單元。 MTA:Thread 將創建並進入一個多線程單元 Unknown:尚未設置 ApartmentState 屬性。 解決辦法兩種: 1) 在Main入口添加STAThread的Attribute [STAThread] static void Main() 2) Thread app = new Thread(new ParameterizedThreadStart(ShowWindow)); app.ApartmentState = ApartmentState.STA; //也可以 Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.SetApartmentState(ApartmentState.MTA); 轉載請注明原創地址:http://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html 例如: static void Main() { Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.SetApartmentState(ApartmentState.MTA); // The following line is ignored since // ApartmentState can only be set once. newThread.SetApartmentState(ApartmentState.STA); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.ApartmentState); newThread.Start(); // Wait for newThread to start and go to sleep. Thread.Sleep(300); try { // This causes an exception since newThread is sleeping. newThread.SetApartmentState(ApartmentState.STA); } catch(ThreadStateException stateException) { Console.WriteLine("\n{0} caught:\n" + "Thread is not in the Unstarted or Running state.", stateException.GetType().Name); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.GetApartmentState()); } } static void ThreadMethod() { Thread.Sleep(1000); } http://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html