2008-08-20 13 views
14
にインポートする

私は現在、古いC++アプリケーションと対話する必要がある新しいC#プロジェクトを作成しています。私はC#アプリケーションで使用する必要があるC++アプリケーションに既に存在するエラー列挙があります。C#の列挙をC#

ファイルが一緒に更新されないと、同期の問題を引き起こす可能性があるので、C#で列挙を再宣言したくないです。。そのように宣言 列挙を取らへの私のための方法はあります:

すべてということでは、私の質問はこれであると述べたが、

typedef enum 
{ 
    eDEVICEINT_ERR_FATAL = 0x10001 
    ... 
} eDeviceIntErrCodes; 

などのようなC#のプログラムでそれを使用します。

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 

答えて

12

PInvoke Interop Assistantツールhttp://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120を参照してください。ネイティブメソッド用のPInvokeシグネチャを生成するための便利なツールです。

私はあなたの列挙型をフィードする場合、このコードを生成します。コマンドラインバージョンのツールが含まれているので、C++バージョンが変更されたときに常に最新の列挙型のC#定義を維持するための自動化されたプロセスを構築できます。


    public enum eDeviceIntErrCodes 
    { 
     /// eDEVICEINT_ERR_FATAL -> 0x10001 
     eDEVICEINT_ERR_FATAL = 65537, 
    } 
2

簡単な答えはノーとなるでしょう。申し訳ありませんが、あなたは再宣告しなければならないでしょう。

私はC++列挙型をenums.csファイルのC#形式にインポートしてビルドの一部として実行するスクリプトを作成しました。すべての方法が同期します。

0

あなたのような列挙型を宣言していた場合:

namespace blah 
{ 
    enum DEVICE_ERR_CODES 
    { 
     eDEVICEINT_ERR_FATAL = 0x10001, 
     eDEVICEINT_ERR_OTHER = 0x10002, 
    }; 
}

、別のファイルに:

DEVICE_ERR_CODES eDeviceIntErrCodes;

とは.cs拡張子を持つ列挙型ファイルの名前、あなたがすることができるかもしれませんそれを働かせる。 あなたはそれが好きで参照したい:あなたが列挙定義が含まれているの.csファイルを#includeすることができ、C/C++で

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;
12

を。 、あなたのC#プロジェクトで

#if CSharp 
namespace MyNamespace.SharedEnumerations 
{ 
public 
#endif 


enum MyFirstEnumeration 
{ 
    Autodetect = -1, 
    Windows2000, 
    WindowsXP, 
    WindowsVista, 
    OSX, 
    Linux, 

    // Count must be last entry - is used to determine number of items in the enum 
    Count 
}; 
#if CSharp 
public 
#endif 

enum MessageLevel 
{ 
    None,   // Message is ignored 
    InfoMessage, // Message is written to info port. 
    InfoWarning, // Message is written to info port and warning is issued 
    Popup   // User is alerted to the message 
}; 

#if CSharp 
    public delegate void MessageEventHandler(MessageLevel level, string message); 
} 
#endif 

条件付きコンパイルシンボル「CSHARP」を設定し、そのようなプリプロセッサ定義が存在しないことを確認してください:プリプロセッサディレクティブを慎重に使用することは、C#とC.

例間の構文の違いの世話をしますC/C++ビルド環境で使用します。

これにより、両方の部品がビルド時に同期化されることが保証されることに注意してください。異なるビルドのバイナリを混在させて一致させると、保証は失敗します。