簡體   English   中英

將C#枚舉傳遞給C ++ CLI的包裝器方法參數

[英]Passing in C# enum to a wrapper method parameter of 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消耗枚舉做什么?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM