跨 C# 和 COM 互操作使用对象C++

Using object across C# & C++ COM Interop

本文关键字:对象 C++ 互操作 COM      更新时间:2023-10-16

我希望有人能给我指明正确的方向。我正在开发一个Outlook插件,它使用带有MAPI后端的C++。我的MAPI知识相当基础,我正在使用MSDN和一本1996年写的书,所以里面没有太多关于C#的内容!

我有一个用C#编写并通过连接器对象访问的通信层。它(连接器)已对接并注册为interop。它可以在Outlook插件(也是C#)和C++(使用CreateInstance(CLSID)的MAPI)中访问

从本质上讲,我希望有相同的连接器对象可用于C&C++目前,我正试图通过这样做来利用Singleton实例:

C++:

Manager.CreateInstance(Manager::CLSID_Manager);
Manager->GetConnector(&m_Connector);

C#:

public IStoreConnector GetConnector()
{
Connector.GetInstance();
}

由于与MAPI后端和C#插件没有任何直接通信,C#还创建了自己的管理器对象实例,以尝试获得相同的实例:

private Manager.Manager manager = new Manager();
private Connector connector = manager.GetConnector();

它按预期成功地创建了对象,但通过C++添加到列表中并没有反映在通过C#创建的消息框中的计数器中。

我假设这是因为C#和C++位于不同的地址空间,所以getInstance()调用不引用同一个实例?

我试图让C++在连接器中添加对文件的引用,然后让C#访问C++刚刚添加到的相同列表。

任何建议或链接到一个写得很好的指南将非常感谢

根据是否可以从非托管C++代码中调用托管C++,我建议两种可能的方法:

  1. 在您的非托管C++中,通过void*抽象您的托管实例,您可以将其作为未修改的C++之间的句柄进行传递。当将它传递给托管C++代码时,您可以将它向上转换到托管对象。singletone模式是使用标准.NET实现进行管理的。只有当所有代码都在同一进程中运行时,这才是好的
  2. 如果您有多个进程,或者只是想要一种不同的方法,您可以将.NET代码实现为COM服务器(建议使用MTA,但也可以使用STA,尤其是在需要顺序访问的情况下)。然后Win32会为您提供COM服务器的单个实例