簡體   English   中英

在C#和C ++ COM互操作中使用對象

[英]Using object across C# & C++ COM Interop

我希望有人可以指出正確的方向。 我正在開發一個Outlook插件,該插件利用C ++和MAPI后端。 我的MAPI知識是相當基礎的,我使用的是MSDN和一本寫於1996年的書,所以那里沒有太多關於C#的討論!

我有一個用C#編寫並可以通過Connector對象訪問的通信層。 它(連接器)已接口並注冊以互操作。 可在Outlook插件(也為C#)和C ++(使用CreateInstance(CLSID) MAPI)中對其進行訪問

本質上,我想為C#和C ++提供相同的Connector對象。 目前,我正在嘗試通過以下方式利用Singleton實例:

C ++:

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

C#:

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

由於沒有與MAPI后端和C#插件進行任何直接通信,因此C#還創建了自己的manager對象實例,以嘗試獲取相同的實例:

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 ++代碼時,您可以將其上載到托管對象。 單調模式使用標准.NET實現進行管理。 僅當所有代碼都在同一進程中運行時,這才是好方法。
  2. 如果您有多個進程,或者只是想采用其他方法,則可以將.NET代碼實現為COM服務器(建議使用MTA,但也可以執行STA,尤其是在需要順序訪問的情況下)。 然后Win32會為您提供COM服務器的單個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM