2013-05-31 68 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