将C#enum传递给C ++ CLI的包装器方法参数

时间:2016-09-26 01:25:15

标签: c# .net enums c++-cli

我有以下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耗材枚举做些什么?

1 个答案:

答案 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);
}