如何使.NET应用程序与VSTO Word文档级插件进行通信?

时间:2015-11-11 11:17:57

标签: c# .net ms-word vsto office-interop

我目前正在开发一个VSTO Word文档级插件和一个WPF应用程序。 WPF应用程序使用Microsoft.Office.Interop.Word.dll程序集中的类和方法打开与文档级插件关联的Word DOCX文件。 我的WPF应用程序需要与VSTO Word文档级插件进行通信,以便在DOCX文件打开时更新文档。

我在网络上发现了一篇名为VSTO Add-ins, COMAddIns and RequestComAddInAutomationService的文章,该文章展示了如何从VBA与Excel Addin进行通信。我以为我可以使用相同的理想来让我的WPF应用程序与我的VSTO Word文档级插件进行通信。

本文介绍了如何覆盖加载项类中的RequestComAddInAutomationService方法。

public partial class ThisAddIn
{
    private AddinUtilities addinUtilities;

    protected override object RequestComAddInAutomationService() 
    {
        if (addinUtilities == null)
        {
            addinUtilities = new AddinUtilities();
        }

        return addinUtilities;
    } 
}

我的VSTO Word文档级插件没有继承自Microsoft.Office.Tools.AddinBase类的ThisAddin类。它有一个继承自Microsoft.Office.Tools.Word.DocumentBase类的ThisDocument类。并且DocumentBase类不包含可以覆盖的名为RequestComAddInAutomationService的方法。

所以问题是,是否有可能另一个应用程序与VSTO Word文档级插件进行通信?如果是这样,请告诉我一个如何做的C#示例?

1 个答案:

答案 0 :(得分:1)

VSTO技术没有任何工具可以将文档级自定义中的代码暴露给外部代码,例如外接程序。显然这是可能的,虽然我从未尝试过。在VSTO论坛中,有关MSDN的讨论概述了所涉及的步骤。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/10decfd2-b1b6-4bf2-aa99-16c1f08b9159/call-code-in-doclevel-assembly-from-addin?forum=vsto

我已经复制了麦克莱恩斯科菲尔德"答案"对于下面的问题,由于不知道链接何时可能会中断。

该讨论提到了Andrew Whitechapel的一个样本。该示例不再可用,但他的博客文章是:

http://blogs.msdn.com/b/andreww/archive/2008/03/20/integrating-doc-level-and-add-in-solutions.aspx

2008年12月16日在MSDN上的麦克莱恩斯科菲尔德引用:

"在示例中,.NET远程处理用于将IDocumentCommands对象从文档级自定义项发送到应用程序级外接程序,并将外接程序对此对象进行的调用传输到文档定制。 .NET远程处理在文档定制中的DocumentCommands类的定义中发挥作用。这个班 实现了IDocumentCommands接口,这是加载项查看此对象的方式,它也是从MarshalByRefObject派生的,它使它能够通过.NET远程处理传输到加载项(跨应用程序域)。

简而言之,这就是样本的工作原理: 1.当加载项加载时,它的RequestComAddInAutomationService方法的覆盖将IAddInCommands对象公开给文档自定义(以及可以访问Application.COMAddIns集合的任何其他Office解决方案)。加载项的此功能在其他Office解决方案的应用程序级加载项中的“调用代码”中有更详细的说明。当您以本主题中描述的方式公开加载项中的对象时,您可以通过COM interop启用其他Office解决方案访问的对象。 2.当文档自定义开始时,ThisDocument_Startup中的代码获取表示加载项的COMAddIn对象,并调用加载项公开的RegisterDocument方法,以向其发送由文档自定义定义的IDocumentCommands对象的实例。因为它发送的实例派生自MarshalByRefObject,所以此对象通过.NET Remoting自动发送到加载项。有关.NET远程处理的更多信息,请参阅远程可用和不可远程对象。 3.现在已建立通信基础设施。当用户单击文档自定义中的操作窗格按钮时,btnCallAddIn_Click事件处理程序使用公开的IAddInCommands对象来调用加载项中定义的InsertText方法 - 此调用使用"标准CLR COM interop"安德鲁指的是。当用户单击由加载项创建的功能区按钮时,btnCallDocument_Click事件处理程序使用公开的IDocumentCommands对象来调用文档自定义中定义的InsertText方法 - 此调用依赖于.NET远程处理。

在此方案中,必须定义文档级自定义和应用程序级外接程序引用的接口。对于用于调用由文档定制(或反之亦然)定义的方法的加载项,解决方案需要一个共同的合同"定义方法的对象。为了使两个解决方案都使用相同的对象,该对象必须实现在两个解决方案引用的程序集中定义的接口。如果您要单独定义此接口,一旦在自定义中再次在加载项中,这些接口将在运行时作为单独的类型进行查看,并且通信将无法工作。"