それは、C#とアンマネージC ++の間で列挙型の宣言を共有することは可能ですか?

StackOverflow https://stackoverflow.com/questions/954321

質問

ネイティブ(アンマネージド)C ++とC#の(管理)?

との間に列挙型の定義を共有する方法はあります

私は完全に、アンマネージコードで使用される以下の列挙型を持っています:

enum MyEnum { myVal1, myVal2 };

私たちのアプリケーションは、時々、管理コンポーネントを使用しています。そのC#の成分(ネイティブDLLから)管理C ++相互運用機能DLLを介して、int型として列挙項目の値を取得します。 (相互運用DLLのみ負荷がC#のコンポーネントが必要な場合。)、C#のコンポーネントが列挙定義を複製しています:

public enum MyEnum { myVal1, myVal2 };

マネージDLLにdllをネイティブC ++を回すことなく、重複を排除する方法はありますか?

役に立ちましたか?

解決

あなたは、単一の.csファイルを使用して、両方のプロジェクト間で共有することができます。 .csファイルにC ++での#includeは問題になりません。

これは例は.csファイルになります

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };

#if !__LINE__
}
#endif

あなたは一つのファイルに複数の列挙型をしたい場合は、あなたがこれを行うことができます(あなたが一時的にC / C ++のために何もしないし、公開を定義する必要がありますが):

#if __LINE__
#define public
#else
namespace MyNamespace
{
#endif

    public enum MyEnum { MyEnumValue1, MyEnumValue2 };
    public enum MyEnum2 { MyEnum2Value1, MyEnum2Value2 };
    public enum MyEnum3 { MyEnum3Value1, MyEnum3Value2 };

#if __LINE__
#undef public
#else
}
#endif

他のヒント

を共有してくれてありがとう!

私は少し周りを演奏し、余分な行のトンを持つことなく、複数の列挙型と定数宣言を持つ方法を見つけました:)

// This is a valid C, C++ and C# file :)
#if __LINE__
#define public
#else
namespace MyCSharpNamespace{
#endif

    public enum MyConstant { MaxStr = 256 };
    public enum MyEnum1{ MyEnum1_A, MyEnum1_B };
    public enum MyEnum2{ MyEnum2_A, MyEnum2_B };

#if __LINE__
#undef public
#else
}
#endif

*あなたのファイルに名前を付けるのを忘れないでください.csファイル

アンマネージライブラリ内のC#ライブラリで定義された列挙型を使用することができますこのように

-

あなたはCOMのC#ライブラリを公開して、アンマネージコードにタイプライブラリをインポートすることができます。

アンマネージドC ++やC#はありませんので、同じ列挙型を使用する方法が管理される1つにC ++ DLLを変更せず、存在しない、二つの異なる世界に住んでいない。

そしてその後も、あなたはおそらく、管理C ++ DLLで重複を必要と思います。

C#の列挙型は、列挙型クラスを継承し、したがって、かなりの数の "トリック" を提供し、一方、

A C ++のenumは、定数の一覧とよく似ています。あなたが見ることができるように、彼らはの非常にの異なるです。

それはネイティブのC ++ DLLがネイティブまたは管理されているかどうかは問題ではない場合は、私が管理される1つにそれを回すと、管理C ++層内部のネイティブの呼び出しをラップと思います。

そのように、あなたはC ++ DLL内の列挙型の重複を持つことができ、また、あなたは、同時にすべての相互運用を取り除くことができます: - )

私は過去に同じ問題を抱えていたし、プリプロセッサの定義を使用して、それを解決してきました。

あなたのアンマネージコードで、またの#defineにあなたの列挙アイテムを置く、あなたのマネージラッパーで含めることができます。

ヘッダ内部

次に、管理対象と管理対象外の列挙の定義では、両方の用途に同じに#defineを使用します。

管理および管理対象外の世界との間に列挙の動きは(基本的にはキャストが必要とされている)少し厄介なように見えますが、管理対象外の世界では、あなたの呼び出し元に、それは見て、罰金を感じるでしょう。

幸運、

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top