2016-09-26 131 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); 
}