Pregunta

Hace un tiempo, escribí algunos ejemplos de interoperabilidad de Word en Visual Studio beta 1, y configuré la referencia a Microsoft.Office.Interop.Word para incrustar (establezca " Tipos de interoperabilidad de incrustación " = verdadero en las propiedades de referencia). Funcionaron bien, y no los he ejecutado por un tiempo ... hasta hoy.

Por supuesto, ahora estoy ejecutando la versión beta 2 de Visual Studio 2010 y .NET 4.0, y parece estar algo roto.

Aquí está el código en cuestión (solo código de ejemplo ficticio):

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

Aquí está la excepción que obtengo la mayoría de las veces, cuando "Insertar tipos de interoperabilidad" se establece en "verdadero" o me conecto con " / l " en la línea de comando:

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

Muy ocasionalmente funciona, lo cual es aún más extraño.

Si configuro " Incrustar tipos de interoperabilidad " a "falso" (o use / r en la línea de comando en lugar de / l) todo funciona bien.

Si elimino el " Visible = true " el configurador de propiedades también funciona ... pero yo que la propiedad está allí ... ¡incluso lo sugiere IntelliSense!

Si bien no he realizado pruebas exhaustivas en varios cuadros, puedo confirmar que mi netbook (que ejecuta Windows 7 en lugar de Vista, pero aún .NET 4.0 beta 2) ve el mismo problema.

¿Alguna sugerencia sobre si soy yo el que está roto o .NET 4.0 beta 2?

¿Fue útil?

Solución

Gran captura! Esto parece un error en nuestra generación de código para propiedades indexadas (no conocida, ¡así que gracias por informar esto!) He probado la última versión interna de VS 2010 y también se reproduce.

Lo que sucede es que si usa un inicializador de objeto, se genera el siguiente código:

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

Sin embargo, si configura Visible = true en una declaración separada (sin el inicializador de objeto), se emite el siguiente código:

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

El PIA solo define el inferior, por lo tanto, falla cuando está utilizando un inicializador de objetos. La solución por ahora es establecer Visible en una declaración separada que debería funcionar bien.

He registrado un error sobre esto. Gracias de nuevo!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top