Domanda

Qualche tempo fa, ho scritto alcuni esempi di interoperabilità di Word in Visual Studio beta 1 e ho impostato il riferimento su Microsoft.Office.Interop.Word da incorporare (impostare i "Tipi di interoperabilità incorporati"; = vero nelle proprietà di riferimento). Funzionavano bene e non li eseguo da un po '... fino ad oggi.

Naturalmente, ora sto eseguendo in versione beta 2 di Visual Studio 2010 e .NET 4.0 - e sembra essere un po 'rotto.

Ecco il codice in questione (solo un esempio di codice fittizio):

using Microsoft.Office.Interop.Word;

class WordImprovement1
{
    static void Main()
    {
        Application app = new Application { Visible = true };
        app.Documents.Add();
        Document doc = app.ActiveDocument;            
        Paragraph para = doc.Paragraphs.Add();
        para.Range.Text = "Thank goodness for C# 4";

        object filename = "demo.doc";
        object format = WdSaveFormat.wdFormatDocument97;
        doc.SaveAs(FileName: ref filename, FileFormat: ref format);
        doc.Close();
        app.Quit();
    }
}

Ecco l'eccezione che ottengo la maggior parte del tempo, quando " Incorpora tipi di interoperabilità " è impostato su " true " oppure mi collego a " / l " sulla riga di comando:

System.MissingMethodException: Method not found:
'Void Microsoft.Office.Interop.Word._Application.set_Visible(Boolean)'.
   at WordImprovement1.Main()

Molto occasionalmente funziona, il che è ancora più bizzarro.

Se imposto " Incorpora tipi di interoperabilità " a "falso" (o usa / r sulla riga di comando invece di / l) tutto funziona bene.

Se rimuovo " Visible = true " funziona anche ... ma so so che la proprietà è lì ... è persino suggerita da IntelliSense!

Anche se non ho eseguito test approfonditi su più caselle, posso confermare che il mio netbook (che esegue Windows 7 anziché Vista, ma ancora .NET 4.0 beta 2) rileva lo stesso problema.

Qualche suggerimento se sono io che sono rotto o .NET 4.0 beta 2?

È stato utile?

Soluzione

Grande cattura! Sembra un bug nella nostra generazione di codice per le proprietà indicizzate (non noto, quindi grazie per averlo segnalato!) Ho provato l'ultima build interna di VS 2010 e si riproduce anche.

Quello che succede è che se si utilizza un inizializzatore di oggetti, viene generato il seguente codice:

Application <>g__initLocal19 = (Application) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("000209FF-0000-0000-C000-000000000046")));
<>g__initLocal19.set_Visible(true);

Tuttavia, se si imposta Visible = true in un'istruzione separata (senza l'inizializzatore di oggetti), viene emesso il seguente codice:

Application application = (Application) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("000209FF-0000-0000-C000-000000000046")));
application.Visible = true;

Il PIA definisce solo quello in basso, quindi non riesce quando si utilizza un inizializzatore di oggetti. La soluzione alternativa per ora è impostare Visible in un'istruzione separata che dovrebbe funzionare correttamente.

Ho registrato un bug al riguardo. Grazie ancora!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top