16

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

ファイルが一緒に更新されないと、同期の問題が発生する可能性があるため、C#で列挙を再宣言したくありません

つまり、私の質問は次のとおりです。次のように宣言された列挙を取得する方法はありますか:

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

次のように C# プログラムで使用します。

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL
4

5 に答える 5

15

C / C ++では、列挙型定義を含む.csファイルを#includeできます。プリプロセッサディレクティブを注意深く使用すると、C#と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

C#プロジェクトで、条件付きコンパイルシンボル「CSharp」を設定し、そのようなプリプロセッサ定義がC /C++ビルド環境に存在しないことを確認します。

これにより、ビルド時に両方のパーツが同期されるようになるだけであることに注意してください。異なるビルドのバイナリを組み合わせて使用​​すると、保証は失敗します。

于 2008-08-20T21:16:33.703 に答える
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,
    }
于 2008-08-20T20:45:28.380 に答える
2

簡単な答えはノーです。申し訳ありませんが、再宣言する必要があります。

ただし、過去に、C++ 列挙型を enums.cs ファイルの C# 形式にインポートし、ビルドの一部として実行するスクリプトを作成しました。これにより、すべてが同期されます。

于 2008-08-20T20:42:17.687 に答える
0

次のように列挙型を宣言した場合:

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

そして別のファイルで:

DEVICE_ERR_CODES eDeviceIntErrCodes;

enum ファイルに .cs 拡張子の名前を付けると、動作させることができる場合があります。次のように参照します。

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;
于 2008-08-20T20:51:23.467 に答える