【问题标题】:Reference to existing instance of a COMVisible object引用 COMVisible 对象的现有实例
【发布时间】:2013-02-28 04:47:26
【问题描述】:

我有两个 .NET 项目,我想在它们之间创建双向通信。 ProjectA 是一个共享加载项,可在 MS Office 应用程序中创建功能区。 ProjectB 是一个 WinForms 应用程序,用于从/向服务器收集/发送信息。

我创建了一个接口IAddInCommunication,它定义了我想从 ProjectB 调用的方法。这个接口在一个单独的类库项目中。 ProjectA 中的Connect 类实现了IAddInCommunication 接口(以及其他一些接口)。我还在 ProjectB 中添加了对接口 DLL 的引用。

现在我正在尝试调用共享加载项的方法,例如,该加载项在 MS Word 中运行。为此,我使用以下代码(在 ProjectB 中):

const string ProgId="ProjectA.Connect";
//...
Type officeAddInType = Type.GetTypeFromProgID(ProgId);           
object obj = Activator.CreateInstance(officeAddInType);
_remoteAddIn = (IAddInCommunication)obj;
_remoteAddIn.TestMethod("Hello");

问题是,_remoteAddIn 没有指向在 Office 中运行的实例。这只是一个新实例(正如人们所期望的那样)。如何连接到共享插件的实际运行实例?

我使用 SendMessage API 解决了从 ProjectA 到 ProjectB 的通信,因为无论如何我的应用程序都需要它。如果真的没有更好的方法,我只会在我的加载项中实现 SendMessage 通信。

【问题讨论】:

  • (IAddInCommunication)System.Runtime.InteropServices.Marshal.GetActiveObject(ProgId) 可能就是您要找的。​​span>
  • @vcsjones 谢谢,它似乎正在工作。现在我只需要解决 E_NOINTERFACE 异常。如果您将其作为实际答案,我会接受您的答案。

标签: c# com interop add-in shared-addin


【解决方案1】:

您可能正在寻找:

(IAddInCommunication)System.Runtime.InteropServices.Marshal.GetActiveObject(Pro‌​gId);

从正在运行的对象表中获取一些东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多