Ứng dụng văn phòng không bỏ sau khi tự động hóa từ Visual Studio.Khách hàng NET

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:317109
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
TRIỆU CHỨNG
Khi bạn tự động một ứng dụng Microsoft Office từ Microsoft Visual Basic.NET hoặc Microsoft Visual C#.NET, các ứng dụng văn phòng không phải bỏ khi bạn gọi các Bỏ thuốc lá phương pháp.
NGUYÊN NHÂN
Khi Visual Studio.Các cuộc gọi NET COM một đối tượng từ quản lý Mã, nó sẽ tự động tạo ra một Wrapper Callable Runtime (RCW). RCW marshals cuộc gọi giữa các.NET ứng dụng và các đối tượng COM. RCW giữ một tham khảo đếm trên đối tượng COM. Vì vậy, nếu tất cả các tài liệu tham khảo chưa phát hành vào RCW, các đối tượng COM không bỏ thuốc lá.
GIẢI PHÁP
Để đảm bảo rằng các ứng dụng văn phòng quits, hãy chắc chắn rằng rằng mã tự động hóa của bạn đáp ứng các tiêu chí sau:
  • Tuyên bố từng đối tượng như là một biến mới. Ví dụ, thay đổi dòng mã sau
    oBook = oExcel.Workbooks.Add()					
    đến sau đây:
    dim oBooks as Excel.WorkbooksoBooks = oExcel.WorkbooksoBook = oBooks.Add()					
  • Sử dụng System.Runtime.InteropServices.Marshal.ReleaseComObject khi bạn đã kết thúc bằng cách sử dụng một đối tượng. Decrements này các tham khảo tính của RCW.
  • Để phát hành tài liệu tham khảo để biến, hãy đặt biến tương đương với Không có gì hoặc Null.
  • Sử dụng các Bỏ thuốc lá phương thức của đối tượng ứng dụng văn phòng bảo với máy chủ để Dừng lại.
TÌNH TRẠNG
Điều này hành vi là do thiết kế.
THÔNG TIN THÊM

Các bước để tạo lại hành vi

  1. Bắt đầu Visual Studio.NET.
  2. Trên các Tập tin trình đơn, nhấp vào Mới sau đó bấm Dự án. Dưới Visual Basic dự án, chọn Ứng dụng Windows và nhấp vào Ok. Form1 được tạo ra theo mặc định.
  3. Thêm một tham chiếu đến các Microsoft Excel đối tượng thư viện. Để thực hiện việc này, hãy làm theo các bước sau:
    1. Trên các Dự án trình đơn, nhấp vào Thêm tài liệu tham khảo.
    2. Trên các COM tab, xác định vị trí thư viện đối tượng cho Excel và bấm Chọn.

      Cho Microsoft Excel 2002: Microsoft Excel 10,0 đối tượng thư viện

      Lưu ý Nếu bạn không làm như vậy, khuyên rằng bạn tải về và cài đặt Microsoft Office XP chính Interop hội (PIAs). Để biết thêm chi tiết về Office XP PIAs, nhấp vào số bài viết sau đây để xem bài viết trong cơ sở kiến thức Microsoft:
      328912Microsoft Office XP chính interop hội đồng (PIAs) có sẵn để tải về
      For Microsoft Office Excel 2003: Microsoft Excel 11,0 đối tượng thư viện
    3. Nhấp vào Ok trong các Thêm tài liệu tham khảo hộp thoại để chấp nhận của bạn lựa chọn.
  4. Trên các Xem trình đơn, nhấp vào Hộp công cụ, và sau đó kéo một Nút kiểm soát vào Form1.
  5. Bấm đúp Button1. Cửa sổ mã cho các hình thức xuất hiện.
  6. Thêm mã sau vào phía trên của Form1.vb:
    Imports Microsoft.Office.Interop					
  7. Thay thế mã sau trong cửa sổ mã
        Private Sub Button1_Click(ByVal sender As System.Object, _       ByVal e As System.EventArgs) Handles Button1.Click    End Sub					
    với những điều sau:
    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. Nhấn F5 để chạy các ứng dụng.
  9. Mở Windows Task Manager. Trong Visual Studio, hiển thị các Đầu ra cửa sổ để xem các thông điệp gỡ lỗi. Nhấp vào nút lệnh và lưu ý rằng một thể hiện của Excel.exe xuất hiện trong các Quy trình danh sách.
  10. Thể hiện của Excel vẫn chạy trong danh sách công việc thậm chí sau khi ứng dụng đã kết thúc ngủ. Đóng hộp thoại và lưu ý rằng Excel không còn xuất hiện trong các Quy trình danh sách.
  11. Khi bạn thực hiện các bước trong phần "Giải quyết", các ứng dụng văn phòng ra khỏi sau khi nó bản phát hành cuối cùng biến. Thay thế các chức năng trong bước 5 với đoạn mã sau:
      Private Sub NAR(ByVal o As Object)    Try      System.Runtime.InteropServices.Marshal.ReleaseComObject(o)    Catch    Finally      o = Nothing    End Try  End SubPrivate 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					
Nếu bạn đang sử dụng Visual C#.NET, tham khảo các mã cho các NAR() chức năng:
private void NAR(object o){    try     {        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);    }    catch {}    finally     {        o = null;    }}

Giải đáp thắc mắc

Lưu ý rằng nếu bạn làm theo các bước được mô tả trong các "Bước để tái sản xuất hành vi" phần, và các máy chủ vẫn còn không tắt xuống, bạn có thể sử dụng các GC.Collect() phương pháp và các GC.WaitForPendingFinalizers() phương pháp sau khi bạn phát hành các đối tượng cuối cùng. Bởi vì thời gian thực hiện bộ sưu tập rác về RCW, các GC.Collect() phương pháp buộc các bộ thu rác để chạy và có thể phát hành bất kỳ tài liệu tham khảo RCW vẫn còn. Các GC.Collect() phương pháp cố gắng để đòi lại tối đa bộ nhớ có sẵn. Lưu ý rằng Điều này không đảm bảo rằng tất cả bộ nhớ sẽ được khai hoang.
gc.collect ReleaseComObject

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 317109 - Xem lại Lần cuối: 12/07/2015 08:49:07 - Bản sửa đổi: 2.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

  • kbnosurvey kbarchive kbautomation kbprb kbmt KB317109 KbMtvi
Phản hồi