2016-09-26 128 views
0

我有一个以下C++/CLI类。将C#枚举传递给C++ CLI的包装方法参数

public ref class QADotNetAPI { 
public: 
    QADotNetAPI() { 

    } 

    ~QADotNetAPI() { 
     QTTerminate(); 
    } 

    int SomeMethod(const char *ch) { 
     return Something(ch); 
    } 

    . 
    . 
    . 

    int IsValid(QTQualifier *pstate) { 
     return QTIsValid(QTFeatureIdEnum::_QT_FEATURE_ALL, pstate); 
    } 
}; 

. 
. 
. 

// The method in unmanaged code (Not within QADotNetAPI scope) 
QT_API QTErrorCode QTIsValid(const QTFeatureId eFeatureId, QTQualifier *eState); 

. 
. 
. 

// The enum, QTQualifier. (Not within QADotNetAPI scope) 
typedef enum QTQualifierEnum 
{ 
    QT_QUALIFIER_OUT_OF_RANGE, 
    QT_QUALIFIER_CORRECTABLE, 
    QT_QUALIFIER_VALID, 
    QT_QUALIFIER_LAST 
} QTQualifier; 

我将上面的C++/CLI类注入到C#应用程序中。 我可以成功调用SomeMethod。 我可以做到这一点,因为我知道传递给这个函数的价值是什么。

但我不知道要传入什么QTIsValid方法。

public enum QaEnum { 
    OUTOFRANGE, 
    CORRECTABLE, 
    VALID, 
    LAST 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    QADotNetAPI qa = new QADotNetAPI(); 
    int rst= qa.Init();   
    rst = qa.IsValid(ref QaEnum.VALID); // Doesn't work 
    // rst = qa.IsValid(out QaEnum.VALID); // Doesn't work too 

    // rst = qa.IsValid(?????) // WHAT TO PASS IN ?? 
} 

有人说“在整个C++/CLI和C#项目中共享enum”。我尝试过使用一堆枚举声明并通过dll在C++/CLI和C#项目上共享它们,但无济于事。

另外,我试着用struct。再次,它没有工作。我可以为C++/CLI耗材枚举做些什么?

+1

你能“QTQualifier”有管理的枚举?或者在C++/CLI代码中提供类似的托管枚举('enum class'),以便C#代码可以使用它?然后在C++代码中保留非托管和托管枚举之间的任何转换。 –

回答

0

的IsValid目前签名只接受一个指针:

int IsValid(QTQualifier *pstate) 
{ 
    return QTIsValid(QTFeatureIdEnum::_QT_FEATURE_ALL, pstate); 
} 

所以我的期望是,C#展示为IntPtr的。 (老实说,我希望,对于C#编译器的方法将不能使用的。) 我的建议IST改变的IsValid如下:

int IsValid(int state) 
{ 
    // TODO: check argument is valid 
    QTQualifier nativeState = static_cast<QTQualifier>(state); 
    return QTIsValid(QTFeatureIdEnum::_QT_FEATURE_ALL, &nativeState); 
} 

这应该工作。

更类型安全的版本,可能是这个

public enum class QaEnum 
{ 
    OUTOFRANGE, 
    CORRECTABLE, 
    VALID, 
    LAST 
} 

int IsValid(int state) 
{ 
    // TODO: check if argument is valid (.NET enums are also only integers) 
    QTQualifier nativeState = static_cast<QTQualifier>(state); 
    return QTIsValid(QTFeatureIdEnum::_QT_FEATURE_ALL, &nativeState); 
}