1

C# から C++ クラス ヘッダー (.h) の列挙型にアクセスしようとしています。これを行う簡単な方法はありますか?私が見たすべての例では、クラスを .dll にコンパイルする必要があります。この例では、このクラスの機能がかなり制限されているため、これは一種の無駄です。

リクエストによる編集: C++ ライブラリは変更できます。実際、C++ ライブラリはプロジェクト (ファームウェア) の主要なコンポーネントであり、私のチームの他のメンバーによって開発されています。C# (私の部分) は単体テスト用です。

4

3 に答える 3

7

現実的には、次の 3 つのオプションがあります。

  1. extern "C"このヘッダーを含み、関心のある列挙値を返すC 関数 ( ) をエクスポートするグルー ライブラリを作成し、 C# からこのライブラリを P/Invoke します。
  2. C# コードで値をハードコードします。
  3. C++ パーサーを作成し、その方法で値を抽出します。(完全な C++ パーサーの方が望ましいか、怠け者でこの特定のバージョンの C++ ヘッダーで動作する単純な正規表現パーサーを作成することができますが、コードが変更された場合に将来壊れる可能性があります。期待しないでください。)
于 2013-01-04T16:15:39.310 に答える
0

まあ、これは CS プリコンパイラを少しおかしくしますが、ビルドします:

#if CSHARP

namespace Test
{
    public enum SharedEnum

#endif //CSHARP

#if CPP
    typedef enum SharedEnum 
#endif //CPP
    {
        One,
        Two,
        Three
    }
#if CPP
    SharedEnum 
#endif //CPP
    ;
#if CSHARP
};
#endif

条件付きコンパイル シンボルCSHARPを C# プロジェクトに追加し、既存の .cs ファイルとプリプロセッサ定義CPPを C++ プロジェクトに追加するだけです。

(同じ考えを持っているYakkの功績)

于 2013-01-04T17:03:54.123 に答える
0

C++ 列挙型にアクセスするには、C++ クラスを .NET が認識できるものに変換する必要があります。これは、C++/CLI としてコンパイルするか (オプションの場合)、.NET 相互運用機能が使用できる DLL に変換することを意味します。アクセス。

于 2013-01-04T16:16:12.603 に答える