2013-05-31 67 views
0

我有一個用C#編寫的專用字典,它需要兩個泛型參數。該接口是Typedefs,C++/CLI,C#+依賴注入

public interface IMyDictionary<TKey, TValue> { ... } 

和它的一個實現

public MyDictionary<TKey, TValue> {...} 

我也有一個複雜的C++模板結構,我在C++/CLI引用類的typedef:

typedef boost::some_complex_template<stuff> MySimpleValueType; 

在我C++/CLI ref類的構造函數,我用來創建字典的一個實例:

MyCppCliClass::MyCppCliClass() 
    : _my_dict(gcnew MyDictionary<MySimpleValueType, Something^>()) 
{...} 

現在,如果你喜歡依賴注入,你會注意到這是不好的。理想情況下,我應該有一個這樣的構造:

MyCppClass::MyCppCliClass(IMyDictionary<MySimpleValueType, Something^>^ dict){...} 

這個類在C#中實例化,所以現在我的問題:

我怎樣才能實例,我使用的是現在的C超出這個有效的引用類++/CLI,假設(afaik)C++模板typedef和純C++類型在C#中都可用?

MySimpleValueType顯然必須是C#本機類型,或字典的實例會失敗:

error C3225: generic type argument for 'T1' cannot be '...', it must be a value type 
> or a handle to a reference type. 

我覺得我應該能在C++/CLI類定義的類型(與類型定義) ,但從外部實例化字典。 C++/CLI typedefs在C#中是不可用的,所以也許有一種方法用getter和var類型演繹?有任何想法嗎?

+0

如果MySimpleType可用在字典,這是否意味着它實際上是一個有效的'ValueType'(例如'的boost :: some_complex_template :: number_type'這原來是'int')? – Medinoc

+0

在調試器中查看它,它告訴我它是一個IMyDictionary 。但是我不認爲我可以依賴它,因爲typedef取決於typedef,而typedef又取決於各種其他類型定義(boost,yknow;))。 – Wilbert

+0

我相信你的C++/CLI代碼不會編譯,如果它不是對CLR有效的類型(比如'unsigned __int64' /'System :: UInt64')。所以我猜如果你的代碼編譯,C#代碼可以鏈接到它。 (畢竟,你實際上並沒有將模板暴露給其他程序集,只有模板實例化結果和泛型) – Medinoc

回答

0

boost是一個無人值守的圖書館。該錯誤消息告訴您,您不能在通用託管類中使用非託管類型。

要解決此問題,請創建一個託管類,它將保存您的非託管類,並將其用於容器中。

public ref class MySimpleValueTypeHolder 
{ 
private: 
    MySimpleValueType* unmanaged; 

public: 
    property MySimpleValueType* ValueType { 
     MySimpleValueType* get() { return this->unmanaged; } 
    } 

    MySimpleValueTypeHolder() { this->unmanaged = new MySimpleValueType(); } 
    ~MySimpleValueTypeHolder() { this->!MySimpleValueTypeHolder(); } 

    !MySimpleValueTypeHolder() 
    { 
     if(this->unmanaged != nullptr) 
     { 
      delete this->unmanaged; 
      this->unmanaged = nullptr; 
     } 
    } 
}; 

Dictionary<MySimpleValueTypeHolder^, Something^>^ foo; 
+0

這是解決另一個問題的好方法。 boost typedef的值是一個值類型,並且該值類型可以用作我的C#字典的關鍵字;它是某種類型的整數,符號和比特大小取決於模板。但是我不能從C#中的類中獲取值類型,因爲它是C++ typedef,而C#不可見。 – Wilbert

+0

C++ typedef無關緊要。你在C#中看到的是取代實際類定義的結果。它不工作的原因是boost typedef不是* value *類型,它是*非託管*類型。 –

+0

請再次閱讀該問題。我很抱歉,但我的問題不是它是一個非託管類型。這是我無法找出typedef匹配的具體值類型。我曾嘗試過使用非值類型,並且我甚至提到了使用非值來獲得的錯誤類型,以顯示它是值類型的(因爲我沒有得到該錯誤)。 – Wilbert