Typedefs,C++/CLI、C#和#x2B;依赖注入

Typedefs,C++/CLI、C#和#x2B;依赖注入,c#,c++,dependency-injection,c++-cli,C#,C++,Dependency Injection,C++ Cli,我有一本用C语言编写的专门词典,它包含两个通用参数。界面是 public interface IMyDictionary<TKey, TValue> { ... } 我觉得我应该能够在C++/CLI类中定义类型(使用typedef),但从外部实例化字典。C++/CLI typedef在C#中不可用,所以可能有一种方法可以使用getter和var的类型推断?有什么想法吗?boost是一个无人管理的库。该错误消息告诉您不能在泛型托管类中使用非托管类型 为了解决这个问题,创建一个托管类来

我有一本用C语言编写的专门词典,它包含两个通用参数。界面是

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

我觉得我应该能够在C++/CLI类中定义类型(使用typedef),但从外部实例化字典。C++/CLI typedef在C#中不可用,所以可能有一种方法可以使用getter和var的类型推断?有什么想法吗?

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;
public ref类MySimpleValueTypeHolder
{
私人:
MySimpleValueType*非托管;
公众:
属性MySimpleValueType*ValueType{
MySimpleValueType*get(){返回此->非托管;}
}
MySimpleValueTypeHolder(){this->unmanaged=new MySimpleValueType();}
~MySimpleValueTypeHolder(){this->!MySimpleValueTypeHolder();}
!MySimpleValueTypeHolder()
{
如果(此->非托管!=nullptr)
{
删除此->非托管;
此->非托管=nullptr;
}
}
};
字典^ foo;

如果MySimpleType在该词典中可用,这是否意味着它实际上是一个有效的
值类型
(例如
boost::一些复杂的模板::数字类型
,结果是
int
)?在调试器中查看它,它告诉我这是一个IMyDictionary。但是我不认为我可以依赖它,因为类型依赖于typedef,而typedef又依赖于其他各种typedef(boost,yknow;)。我相信如果您的C++/CLI代码不是对CLR有效的类型(比如
unsigned_UInt64
/
System::UInt64
),它将无法编译。所以我想如果你的代码编译好了,C代码可以链接到它。(毕竟,您实际上并没有向其他程序集公开模板,只有模板实例化结果和泛型)是的,这也是我的结论。我更新了问题。我认为主要的问题是我在C++/CLI中创建的typedef在C#中不可见。这是解决另一个问题的好方法。boost typedef的计算结果是一个值类型,该值类型可以用作我的C#dictionary的键;它是某种类型的int,符号性和位大小取决于模板。但是我不能从C类中获得值类型,因为它是C++的Type,它对于C++是不可见的。在C#中看到的是在中替换实际类定义的结果。它不起作用的原因是因为boost typedef不是值类型,而是非托管类型。请重新阅读问题。很抱歉,但我的问题不是它是非托管类型。这是因为我无法找到typedef匹配的特定值类型。我确实尝试过使用非值类型,我甚至提到了使用非值时出现的错误类型,以表明这是一种值类型(因为我没有得到该错误)。
typedef boost::some_complex_template<stuff>    MySimpleValueType;
MyCppCliClass::MyCppCliClass()
    : _my_dict(gcnew MyDictionary<MySimpleValueType, Something^>())
{...}
MyCppClass::MyCppCliClass(IMyDictionary<MySimpleValueType, Something^>^ dict){...}
error C3225: generic type argument for 'T1' cannot be '...', it must be a value type
> or a handle to a reference type.
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;