2016-09-26 4 views
0

次のC++/CLIクラスがあります。C++のラッパーメソッドパラメーターにC#enumを渡す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宣言の束を使ってそれを試み、C++/CLIとC#プロジェクトの両方でdllを使って共有しましたが、無駄です。

また、私はstructで試しました。再び、それはうまくいかなかった。 C++/CLI消耗品の列挙体で何ができますか?

+1

可能性があり

あなたは「QTQualifier」管理列挙型を作ることはできますか?または、C#コードでこれを使用できるように、C++/CLIコード内で使用可能な同様の管理されたenum( 'enum class')を使用できますか?次に、C++コード内のアンマネージ列とマネージ列列の間の変換を保持します。 –

答えて

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