簡體   English   中英

具有C ++ / CLI和C#“ as”運算符的COM包裝器

[英]COM wrapper with C++/CLI and C# “as” operator

我正在用C ++ / CLI編寫COM包裝程序,並在如何解決問題上苦苦掙扎。

從C#方面,我將調用如下代碼:

var item = myWrappedObj.getSomeItem() as AnotherItem;

C ++ / CLI受管端擁有一個指向非受管對象的指針:

public ref class MyWrapped {
    NativeType* unManagedEl;
public:
    Object^ getSomeItem() { return unManagedEl->getSomeItem(); }
    ...
};

C ++ / CLI非托管端完成此工作,並且假設返回包裝在UnknownBase本機類中的IUnknown *

public class UnknownBase {
    IUnknown* myEl;
public:
    UnknownBase(IUnknown* el) { myEl = el; }
    ...
};

public class NativeType {
    COMType* myEl;
public:
    Object^ getSomeItem() { 
        IUnknown* el; myEl->getItemNative(&el); return UnknownBase(el); 
    }
};

現在,該接口中有許多“ AnotherItem”類型(上面的第一部分代碼),我正在考慮創建從UnknownBase等派生的托管+非托管包裝。然后呢? 我如何為C#“ as”運算符使用相應的代碼? 從MSDN,我知道dynamic_cast是將被稱為“ as”的相應運算符,但是包裝了IUnknown指針后,我不能僅依賴dynamic_cast。 我只是試圖查找dynamic_cast是否使用類的類型轉換操作符(以便我可以在單獨的類型轉換操作符中手動檢查類型相等性),但是我認為不是嗎?

我在C#端有一個龐大的代碼庫,使用的是經過整理的+ tlbimped接口,因此我試圖保持該接口完全相同(以替換“從黑暗面到沼澤”的經過整理的接口),因此我來了與雙重包裝器結合(實際上,使用單獨的名稱空間等來做更多的事情)。

我意識到我需要找出IUnknown類型是什么,並gcnew為其指定相應的托管類型(ref類)。 我簡化了上面問題的代碼,但通常它更像下面的代碼(int id引用正確的類型)。 抱歉,上面的示例代碼中的錯誤可能使回答這個問題變得很困難,很抱歉。

而且,不存在非托管類與對象^之間的轉換,因此嘗試創建UnknownBase(el)無效。

public class NativeType {
    COMType* myEl;
public:
    Object^ getSomeItem(int id) { 
        IUnknown* el; 
        myEl->getItemNative(id, &el); 
        switch(id) {
            case 1: return gcnew AnotherItem(el);
            case 2: return gcnew ... 
        }
    }
};

我會盡快測試。

暫無
暫無

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

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