2012-10-18 37 views
8

Gần đây tôi đã đăng câu hỏi về việc đọc các tệp Word here.Sự mơ hồ trong mã Interop Word

Ứng dụng chạy tốt tuy nhiên tôi nhận được thông báo Cảnh báo này;

Cảnh báo mơ hồ giữa phương pháp 'Microsoft.Office.Interop.Word._Document.Close (object ref, đối tượng ref, đối tượng ref)' và phi pháp 'Microsoft.Office.Interop.Word.DocumentEvents2_Event. Gần'. Sử dụng nhóm phương pháp .

Dường như có một số sự mơ hồ từ một số không gian tên sử dụng và tôi muốn biết cách giải quyết vấn đề này. Mặc dù ứng dụng chạy, tôi muốn giảm thiểu cảnh báo/lỗi.

Tôi đã cung cấp mã bên dưới cho lớp học; Điểm mấu nó đề cập đến hai dòng sau

docs.Close(ref nullobject, ref nullobject, ref nullobject); 
wordObject.Quit(ref nullobject, ref nullobject, ref nullobject); 

Toàn bộ mã:

namespace Wizard.Classes 
{ 
    class MSWordReader 
    { 
     public void read(String filename) 
     { 
      String buffer = ""; 
      try 
      { 
       Microsoft.Office.Interop.Word.Application wordObject = new 
       Microsoft.Office.Interop.Word.Application(); 
       object file = filename; //this is the path 
       object nullobject = Type.Missing; 
       object visible = false; 
       object readonlyp = true; 
       object addtorecent = false; //add to words recent filelist 

       Microsoft.Office.Interop.Word.Document docs = wordObject.Documents.Open 
        (ref file,ref nullobject, ref readonlyp, ref addtorecent, 
        ref nullobject, ref nullobject, ref nullobject, ref nullobject, 
        ref nullobject, ref nullobject, ref nullobject, ref visible, 
        ref nullobject, ref nullobject, ref nullobject, ref nullobject 
            ); 
       docs.ActiveWindow.Selection.WholeStory(); 
       docs.ActiveWindow.Selection.Copy(); 
       IDataObject data = Clipboard.GetDataObject(); 
       buffer = data.GetData(DataFormats.Text).ToString(); 

       docs.Close(ref nullobject, ref nullobject, ref nullobject); 

       wordObject.Quit(ref nullobject, ref nullobject, ref nullobject); 
       MessageBox.Show(buffer); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

Trả lời

19

Để giải quyết sự mơ hồ, sử dụng:

((Microsoft.Office.Interop.Word._Document)docs).Close(ref nullobject, ref nullobject, ref nullobject);  
((Microsoft.Office.Interop.Word._Application)wordObject).Quit(ref nullobject, ref nullobject, ref nullobject); 
+0

cảm ơn @Avi Shmidman – IEnumerable

6

Hãy thử casting của bạn docs đầu tiên:

((_Document)docs).Close(ref nullobject, ref nullobject, ref nullobject); 

Giao diện Microsoft.Office.Interop.Word.Document thực hiện cả giao diện DocumentEvents2_Event_Document . Mỗi phương thức có một phương thức gần gũi, và trình biên dịch đang gặp khó khăn trong việc xác định ý của bạn.

Ngoài ra, bạn có thể khai báo biến docs bạn như là một _Document ở nơi đầu tiên:

Microsoft.Office.Interop.Word._Document docs = wordObject.Documents.Open ... 

Độ phân giải tương tự có thể được sử dụng cho sự mơ hồ về wordObject của bạn, đúc nó vào một _Application.

+0

cảm ơn @goric; :) – IEnumerable

1

Các giải pháp đề xuất hoạt động tốt, nhưng nó để lại ReSharper với một lỗi Invocation mơ hồ rằng bạn không thể thoát khỏi trừ bằng cách sử dụng cũ "Bỏ qua lỗi" lừa trong hộp thoại R # Errors, mặc dù trình biên dịch đủ hạnh phúc với nó. Tôi không thể thực sự có được một giải pháp tốt từ R # và nó chỉ xuất hiện ở một vài nơi để câu trả lời ít xấu nhất mà tôi thấy rằng hoạt động và không tạo ra lỗi Visual Studio hoặc R # là truyền với một động lực.

((dynamic) Doc).Close(); 

Không lý tưởng, nhưng tôi chỉ giữ mũi và sử dụng nó. Nếu bạn sẽ sử dụng nó nhiều hơn một lần bạn rõ ràng có thể lưu vào một biến động. Bạn về mặt kỹ thuật có thể sử dụng năng động cho tất cả mọi thứ (nó chỉ là COM bị ràng buộc muộn), nhưng bạn sẽ mất tất cả intelliSense vì vậy tôi chỉ sử dụng nó trên vài phương thức và sự kiện mà nó xuất hiện.