代码之家  ›  专栏  ›  技术社区  ›  Jon Skeet

PIA嵌入是否在.NET 4.0 Beta 2中中断?

  •  27
  • Jon Skeet  · 技术社区  · 15 年前

    不久前,我在Visual Studio Beta 1中编写了一些单词interop示例,并将引用设置为 Microsoft.Office.Interop.Word 要嵌入(在引用属性中设置“嵌入互操作类型”=true)。这些很好用,我有一段时间没有运行它们了…直到今天。

    当然,现在我运行的是Visual Studio 2010和.NET 4.0的测试版2,它似乎有点坏了。

    下面是有问题的代码(只是伪示例代码):

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

    我有个例外 当“嵌入互操作类型”在命令行上设置为“真”或“我用“/l”链接时:

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

    偶尔,它会起作用——更奇怪的是。

    如果我将“嵌入互操作类型”设置为“假”(或者在命令行上使用/r而不是/l),那么一切都可以正常工作。

    如果我删除“visible=true”属性setter,它也会起作用…但我 知道 那房子就在那里…它甚至被IntelliSense建议!

    虽然我没有对多个盒子进行详尽的测试,但是我 可以 确认我的上网本(运行Windows7而不是Vista,但仍然是.NET 4.0测试版2)看到相同的问题。

    关于是我坏了还是.NET 4.0 Beta 2有什么建议吗?

    1 回复  |  直到 15 年前
        1
  •  18
  •   Kirill Osenkov    15 年前

    大抓!这看起来像是我们为索引属性生成的代码中的一个错误(不是已知的错误,所以感谢您报告!)我尝试过最新的内部版本的VS 2010,它也复制了。

    如果使用对象初始值设定项,将生成以下代码:

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

    但是,如果在单独的语句(不带对象初始值设定项)中设置visible=true,则会发出以下代码:

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

    PIA只定义了最下面的一个,因此当使用对象初始值设定项时,它会失败。现在的解决方法是在一个单独的语句中设置可见,这样可以很好地工作。

    我记录了一个关于这个的错误。再次感谢!

    推荐文章