19

ネイティブ (アンマネージド) C++ と (マネージド) C# の間で列挙型定義を共有する方法はありますか?

完全にアンマネージ コードで使用される次の列挙型があります。

enum MyEnum { myVal1, myVal2 };

私たちのアプリケーションは、マネージド コンポーネントを使用することがあります。その C# コンポーネントは、マネージ C++ 相互運用 dll を介して (ネイティブ dll から) 列挙項目の値を int として取得します。(interop dll は、C# コンポーネントが必要な場合にのみ読み込まれます。) C# コンポーネントは列挙型の定義を複製しています。

public enum MyEnum { myVal1, myVal2 };

ネイティブ C++ dll をマネージ dll に変換せずに重複を排除する方法はありますか?

4

5 に答える 5

19

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

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

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

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

#if !__LINE__
}
#endif

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

#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
于 2009-06-05T16:51:47.830 に答える
5

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

私は少し遊んで、大量の余分な行を持たずに複数の列挙型と定数の宣言を持つ方法を見つけました:)

// 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

于 2012-04-23T18:24:07.710 に答える
3

C#ライブラリをCOMに公開してから、タイプライブラリをアンマネージコードにインポートできます。これにより、アンマネージライブラリのC#ライブラリで定義された列挙型を使用できるようになります。

于 2009-06-05T05:28:44.410 に答える
0

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

アンマネージコードで、マネージラッパーにも含めることができるヘッダー内で、列挙アイテムを#defineに配置します。

次に、マネージドとアンマネージドの列挙型定義で、両方の使用法に同じ#defineを使用します。

管理された世界と管理されていない世界の間の列挙の移動は少し厄介に見えますが(基本的にキャストが必要です)、管理されていない世界の発信者にとっては、見た目も感じも良好です。

幸運を、

于 2009-06-05T09:14:40.660 に答える
0

アンマネージド C++ と C# は 2 つの異なる世界に存在するため、c++ DLL をマネージド DLL に変更せずに同じ列挙型を使用する方法はありません。

その場合でも、マネージ C++ DLL で複製が必要になる可能性があります。

C++ 列挙型は定数のリストによく似ていますが、C# 列挙型は Enum クラスを継承しているため、かなりの数の「トリック」が提供されます。ご覧のとおり、それらは非常に異なっています。

ネイティブ C++ DLL がネイティブであるかマネージドであるかが問題でない場合は、それをマネージド DLL に変換し、ネイティブ呼び出しをマネージド C++ レイヤー内にラップします。

そうすれば、C++ DLL 内で列挙型の重複を保持でき、同時にすべての相互運用を取り除くこともできます :-)

于 2009-06-05T05:03:05.817 に答える