【问题标题】:How to make a .NET app communicate with a VSTO Word Document-Level addin?如何使 .NET 应用程序与 VSTO Word 文档级插件通信?
【发布时间】:2015-11-11 11:17:56
【问题描述】:

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

我在网上找到了一篇名为 VSTO Add-ins, COMAddIns and RequestComAddInAutomationService 的文章,其中介绍了如何从 VBA 与 Excel 插件通信。我认为我可以使用相同的理想来使我的 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# 示例来说明如何做到这一点?

【问题讨论】:

  • THIS 您可能会感兴趣

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


【解决方案1】:

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

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

我已将 McLean Schofields 的“答案”复制到以下问题,因为不知道链接何时会断开。

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

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

2008 年 12 月 16 日 MSDN 中 McLean Schofield 的引述:

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

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

在这种情况下,定义文档级自定义和应用程序级插件都引用的接口是必要的。为了让插件调用由文档自定义定义的方法(反之亦然),解决方案需要一个定义该方法的通用“合同”对象。为了使两个解决方案都使用相同的对象,该对象必须实现在两个解决方案引用的程序集中定义的接口。如果您改为单独定义此接口,一次在自定义中,然后在加载项中,这些接口将在运行时被视为单独的类型,并且通信将不起作用。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多