2012-10-18 15 views
8

Recentemente ho postato una domanda sulla lettura di file Word here.Ambiguity in Word Interop code

L'app funziona correttamente, tuttavia ricevo questo messaggio di avviso;

ambiguità Warning tra metodo 'Microsoft.Office.Interop.Word._Document.Close (ref oggetto, oggetto ref, oggetto ref)' e non metodo 'Microsoft.Office.Interop.Word.DocumentEvents2_Event. Vicino'. Utilizzo del gruppo di metodi .

Sembra esserci qualche ambiguità da parte di alcuni che utilizzano lo spazio dei nomi e vorrei sapere come risolvere questo problema. Sebbene l'app sia in esecuzione, vorrei ridurre al minimo gli avvisi/errori.

Ho fornito il codice seguente per la classe; La linea si riferisce a sono queste due linee

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

L'intero codice:

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

risposta

19

Per risolvere l'ambiguità, l'uso:

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

grazie @Avi Shmidman – IEnumerable

6

Prova a trasmettere il vostro docs prima:

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

L'interfaccia Microsoft.Office.Interop.Word.Document implementa sia le DocumentEvents2_Event e _Document interfacce . Ognuno ha un metodo vicino e il compilatore non riesce a determinare quale intendi.

alternativa, è possibile dichiarare la variabile docs come _Document in primo luogo:

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

La stessa risoluzione può essere usato per le ambiguità sul wordObject, colata a un _Application.

+0

grazie a @goric; :) – IEnumerable

1

Le soluzioni proposte funziona bene, ma lascia ReSharper con un errore Invocazione ambiguo che non può sbarazzarsi di eccezione con il vecchio "ignorare gli errori" trucco nella finestra di dialogo Errori R #, anche se il compilatore è abbastanza soddisfatto.

Non riesco a ottenere una buona soluzione da R # e si presenta solo in alcuni punti, quindi la risposta meno valida che ho trovato funziona e non produce errori di Visual Studio o R # è quello di trasmettere a una dinamica.

((dynamic) Doc).Close(); 

Non ideale, ma mi tengo il naso e lo uso. Se hai intenzione di usarlo più di una volta puoi ovviamente salvare su una variabile dinamica. Potresti tecnicamente utilizzare la dinamica per tutto (è solo una COM tardiva), ma perdi tutto il sistema intelliSense, quindi lo uso solo nei pochi metodi ed eventi in cui è presente.