【问题标题】:Sharing Add-in between Office Apps在 Office 应用程序之间共享加载项
【发布时间】:2009-07-11 00:36:20
【问题描述】:

我用 C# 和 .NET 2.0 编写了一个 Office 共享插件。它对所有办公应用程序使用相同的 COM Shim。目前,每个实例都创建自己的类实例——他们不知道加载项正在另一个应用程序上运行。

是否可以这样,例如,当 Word 加载项启动时,它可以检测到 Excel 加载项已经在运行?可以互相交流吗?

假设我的 dll 称为 Addin.dll。例如,当 Word 打开时,它会运行 Addin.dll 中实现 IExtensibility 接口的代码,并创建一个类,我们称之为 WordAddin。当 Excel 打开时,它还会运行 Addin.dll 中的代码,并创建 ExcelAddin 的一个实例。现在,假设 Word 正在运行并且 WordAddin 存在。打开 Excel 时,Addin.dll 被加载到不同的 AppDomain。它不知道 WordAddin 的存在。我希望 ExcelAddin 知道 WordAddin 的存在,并能够与它通信,也许通过创建两者的父类。

有人知道怎么做吗?

【问题讨论】:

    标签: c# com ms-office add-in


    【解决方案1】:

    您可以使用 Microsoft 消息队列 (MSMQ) 执行此操作:Use Microsoft Message Queuing in C# for inter-process communication

    这篇代码项目文章展示了如何检测正在运行的实例以及如何在它们之间复制命令行参数:

    Single-Instance C# Application - for .NET 2.0

    不是您要问的,但可能会感兴趣:Detecting a running instance of a program and passing it information

    【讨论】:

    • 谢谢!假设我的 dll 称为 Addin.dll。例如,当 Word 打开时,它会运行 Addin.dll 中实现 IExtensibility 接口的代码,并创建一个类,我们称之为 WordAddin。当 Excel 打开时,它还会运行 Addin.dll 中的代码,并创建 ExcelAddin 的一个实例。现在,假设 Word 正在运行并且 WordAddin 存在。打开 Excel 时,Addin.dll 被加载到不同的 AppDomain。它不知道 WordAddin 的存在。我希望 ExcelAddin 知道 WordAddin 的存在,并能够与它通信,也许通过创建两者的父类。
    【解决方案2】:

    我最终使用命名管道在进程之间进行通信

    【讨论】:

      【解决方案3】:

      事实上,我已经完全按照您的要求完成了。我去找老式的 Windows 消息。没什么特别的 - 所以它会起作用! :-)

      让您的插件使用 NativeWindow 类创建一个“窗口”,并给它一个预先确定的唯一名称。然后在插件启动时使用 GetWindow 和 GetWindowText 搜索此类窗口的另一个实例。使用 SendMessage 或 PostMessage 进行通信。就这么简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 2017-05-20
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多