2012-10-18 77 views
8

我最近公佈的關於閱讀Word文件here的問題。歧義在Word中互操作代碼

該應用程序運行然而罰款我得到這樣的警告消息;方法 'Microsoft.Office.Interop.Word._Document.Close(參考對象,引用對象,參考對象)' 和非法「Microsoft.Office.Interop.Word.DocumentEvents2_Event之間

警告歧義。關'。使用 方法組。

似乎有些使用命名空間的歧義,我想知道如何解決這個問題。雖然該應用程序運行,但我想盡量減少警告/錯誤。

我提供以下的代碼的類;該生產線是指在這兩行

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

整個代碼:

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); 
      } 
     } 
    } 
} 

回答

19

要解決的模糊性,使用:

((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

謝謝@Avi Shmidman – IEnumerable

6

試試您鑄造docs第一:

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

Microsoft.Office.Interop.Word.Document接口同時實現DocumentEvents2_Event_Document接口。每種方法都有一個很接近的方法,編譯器無法確定你的意思。

或者,你可以聲明你的docs變量作爲首位_Document

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

同樣的分辨率,可用於歧義您wordObject,它轉換成一_Application

+0

感謝@goric; :) – IEnumerable

1

提出的解決方案能正常工作,但它留下ReSharper的有,你不能獲得使用舊的「忽略錯誤」擺脫除了曖昧調用錯誤在R#錯誤對話框中竅門,儘管編譯器對它很滿意。

我真的無法得到來自R#一個很好的解決方案,它只是在少數地方出現這樣最不壞的答案,我發現作品,且不會產生任何的Visual Studio或R#錯誤是投到一個動態的。

((dynamic) Doc).Close(); 

不理想,但我只是抓住我的鼻子,並使用它。如果你打算多次使用它,你顯然可以保存到一個動態變量中。你可以在技術上使用動態的一切(這只是後期綁定COM),但你會失去所有的智能感知,所以我只用它的一些方法和事件從何而來了。