com - .NET 4.0 beta 2 中的 PIA 嵌入是否已损坏?

标签 com interop .net-4.0 c#-4.0 .net-4.0-beta-2

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

当然,现在我在 Visual Studio 2010 和 .NET 4.0 的 beta 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();
    }
}

这是我大多数时候遇到的异常(exception)情况,当“嵌入互操作类型”设置为“true”或者我在命令行上与“/l”链接时:
System.MissingMethodException: Method not found:
'Void Microsoft.Office.Interop.Word._Application.set_Visible(Boolean)'.
   at WordImprovement1.Main()

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

如果我将“嵌入互操作类型”设置为“false”(或在命令行上使用/r 而不是/l),则一切正常。

如果我删除“Visible = true”属性 setter ,它也可以工作......但我知道该属性在那里......它甚至被IntelliSense建议!

虽然我还没有对多个机器进行详尽的测试,但我可以确认我的上网本(运行 Windows 7 而不是 Vista,但仍然是 .NET 4.0 beta 2)看到了同样的问题。

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

最佳答案

大收获!这看起来像是我们的索引属性代码生成中的一个错误(不是已知的错误,所以感谢您报告这个错误!)我已经尝试过 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 只定义底部的,因此当您使用对象初始值设定项时它会失败。现在的解决方法是在单独的语句中设置 Visible 应该可以正常工作。

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

关于com - .NET 4.0 beta 2 中的 PIA 嵌入是否已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826255/

相关文章:

.net - 如何将 IntPtr 转换为 Stream?

.net - COM 接口(interface)问题 - .NET

c# - 将 WinForm 应用程序限制为具有多个实例的一个进程

c# - 为什么要注册 COM 接口(interface)?

c# - 在 Windows CE 的托管 C# 代码中加载 native DLL 作为调试模块

c# - Entity Framework 4.0 如何确定实体的工厂方法需要哪些参数?

c# - 将文件添加到 Itunes com

c# - 将 SAFEARRAY 从 C# 传递到 COM

.net - 用 .Net framework 2 编写的旧库在 .Net 4 中使用

.net-4.0 - 为什么 32 位应用程序使用的 RAM 比 64 位版本少,即使 32 位可执行文件更大