โปรแกรมประยุกต์ office ไม่ปิดหลังจากการดำเนินการอัตโนมัติจากไคลเอนต์ Visual Studio .NET

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 317109 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อคุณทำให้เป็นโปรแกรมประยุกต์ Microsoft Office จาก Microsoft Visual Basic .NET หรือ Microsoft Visual c# .NET โปรแกรมประยุกต์ Office ไม่ปิดเมื่อคุณเรียกใช้การQUITวิธีการ

สาเหตุ

เมื่อ Visual Studio .NET เรียกวัตถุ COM จากรหัสที่ได้รับการจัดการ มันจะสร้างการรันไทม์ Callable Wrapper (RCW) RCW marshals โทรศัพท์ระหว่างโปรแกรมประยุกต์.NET และวัตถุ COM RCW เก็บจำนวนการอ้างอิงบนวัตถุ COM ดังนั้น ถ้ามีการอ้างอิงทั้งหมดได้ไม่ถูกนำออกใช้ในการ RCW วัตถุ COM ไม่ปิดอยู่

การแก้ไข

เมื่อต้องการตรวจสอบให้แน่ใจว่า โปรแกรมประยุกต์ Office ออกจาก ตรวจสอบให้แน่ใจว่า รหัสการดำเนินการอัตโนมัติของคุณมีคุณสมบัติตรงตามเงื่อนไขต่อไปนี้:
  • กำหนดแต่ละวัตถุเป็นตัวแปรใหม่ ตัวอย่างเช่น ทำเปลี่ยนบรรทัดต่อไปนี้ของรหัส
    oBook = oExcel.Workbooks.Add()
    					
    เมื่อต้องการต่อไปนี้:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • การใช้System.Runtime.InteropServices.Marshal.ReleaseComObjectเมื่อคุณทำเสร็จแล้วโดยใช้วัตถุ decrements นี้อ้างอิงนับของการ RCW
  • เมื่อต้องการปล่อยการอ้างอิงถึงตัวแปร เซ็ตตัวแปรเท่ากับไม่มีสิ่งใดหรือnull.
  • ใช้แบบQUITเมธอดของวัตถุโปรแกรมประยุกต์ Office เพื่อบอกเซิร์ฟเวอร์การปิดระบบ

สถานะ

ลักษณะการทำงานนี้เกิดจากการออกแบบ

ข้อมูลเพิ่มเติม

ขั้นตอนในการทำให้สถานการณ์เกิดขึ้นอีกครั้ง

  1. เริ่ม Visual Studio .NET
  2. ในการแฟ้ม:เมนู คลิกใหม่แล้ว คลิกProject. ภายใต้โครงการ visual Basicเลือกแอพลิเคชันของ windowsคลิกตกลง. Form1 จะถูกสร้างขึ้นตามค่าเริ่มต้น
  3. เพิ่มการอ้างอิงไปยังการไลบรารีวัตถุ Microsoft Excel. โดยให้ทำตามขั้นตอนต่อไปนี้::
    1. ในการProjectเมนู คลิกเพิ่มการอ้างอิง.
    2. ในการcomแท็บ ค้นหาไลบรารีวัตถุสำหรับ Excel และจากนั้น คลิกเลือก.

      สำหรับ Microsoft Excel 2002:การไลบรารีวัตถุ Microsoft Excel 10.0

      หมายเหตุ:ถ้าคุณไม่ได้ทำสิ่งนี้ ขอแนะนำให้ คุณดาวน์โหลด และติดตั้งแอสเซที่ Microsoft Office XP หลัก Interop มบลี (PIAs)สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Office XP PIAs คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
      328912แอสเซ Microsoft Office XP หลัก interop มบลี (PIAs) พร้อมใช้งานสำหรับการดาวน์โหลด
      สำหรับ Microsoft Office Excel 2003:การไลบรารีวัตถุ Microsoft Excel 11.0
    3. คลิกตกลงในการเพิ่มการอ้างอิงกล่องโต้ตอบเพื่อยอมรับการเลือกของคุณ
  4. ในการมุมมองเมนู คลิกกล่องเครื่องมือแล้ว ลากตัวปุ่มควบคุมลงใน Form1
  5. คลิกสองครั้งbutton1. หน้าต่างรหัสสำหรับแบบฟอร์มปรากฏขึ้น
  6. เพิ่มรหัสต่อไปนี้ที่ด้านบนของ Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. แทนโค้ดต่อไปนี้ในหน้าต่างรหัส
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    มีการต่อไปนี้:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBook As Excel.Workbook = oApp.Workbooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        oSheet = Nothing
        oBook.Close(False)
        oBook = Nothing
        oApp.Quit()
        oApp = Nothing
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    					
  8. กด F5 เพื่อเรียกใช้โปรแกรมประยุกต์
  9. เปิดตัวจัดการงานของ Windows ใน Visual Studio แสดงหน้าต่างออกเพื่อดูข้อความการตรวจแก้จุดบกพร่อง คลิกที่ปุ่มคำสั่ง และหมายเหตุว่า อินสแตนซ์ของ Excel.exe ปรากฏขึ้นในการกระบวนการรายการ
  10. อินสแตนซ์ของ Excel ยังคงรันในรายการงานแม้ว่าโปรแกรมประยุกต์ได้เสร็จสิ้นการใช้งาน ปิดกล่องโต้ตอบ และหมายเหตุว่า Excel ไม่ปรากฏในนั้นกระบวนการรายการ
  11. เมื่อคุณปฏิบัติตามขั้นตอนในส่วน "การแก้ปัญหา" โปรแกรมประยุกต์ Office ออกจากหลังจากนั้นออกตัวแปรล่าสุด แทนฟังก์ชันในขั้นตอนที่ 5 ด้วยรหัสต่อไปนี้:
      Private Sub NAR(ByVal o As Object)
        Try
          System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
        Catch
        Finally
          o = Nothing
        End Try
      End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBooks As Excel.Workbooks = oApp.Workbooks
        Dim oBook As Excel.Workbook = oBooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        NAR(oSheet)
        oBook.Close(False)
        NAR(oBook)
        NAR(oBooks)
        oApp.Quit()
        NAR(oApp)
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    					
ถ้าคุณกำลังใช้ Visual .NET c# อ้างอิงรหัสสำหรับnar()ฟังก์ชัน:
private void NAR(object o)
{
    try 
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch {}
    finally 
    {
        o = null;
    }
}

การแก้ไขปัญหา

โปรดสังเกตว่า ถ้าคุณทำตาม ขั้นตอนที่อธิบายขั้นตอนในการ "ต่อไปยัง Reproduce ลักษณะการทำงาน"ส่วน และเซิร์ฟเวอร์ยังไม่ปิด คุณสามารถใช้ได้GC.Collect()วิธีการ และGC.WaitForPendingFinalizers()เมธอดหลังจากที่คุณนำออกใช้อ็อบเจกต์ล่าสุด เนื่องจากรันไทม์จะทำการเรียกเก็บเงินเบจบน RCW,GC.Collect()วิธีการบังคับให้ตัวเก็บรวบรวมเบจให้ทำงาน และอาจปล่อยการอ้างอิงใด ๆ ที่ยังมี RCW กระบวนการGC.Collect()วิธีพยายามที่จะเพิ่มหน่วยความจำสูงสุดที่พร้อมใช้งาน โปรดสังเกตว่า นี้ไม่รับประกันว่า หน่วยความจำทั้งหมดจะสามารถเรียกคืน

คุณสมบัติ

หมายเลขบทความ (Article ID): 317109 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 5.0
ใช้กับ
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Keywords: 
kbautomation kbprb kbmt KB317109 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:317109

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com