我有以下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#项目"中共享枚举。我尝试使用一堆枚举声明并在C ++ / CLI和C#项目上通过dll共享它们但无济于事。
另外,我尝试了struct
。再说一遍,它没有用。我能为C ++ / CLI耗材枚举做些什么?
答案 0 :(得分:0)
IsValid的当前签名只接受指针:
int IsValid(QTQualifier *pstate)
{
return QTIsValid(QTFeatureIdEnum::_QT_FEATURE_ALL, pstate);
}
所以我的期望是C#显示为IntPtr。 (老实说,我希望对于C#编译器来说,该方法根本不可用。) 我的建议是按如下方式更改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);
}