2009-07-30 17 views
4

私はC++で定数定義を含むファイルを持っていますが、C#プロジェクトで同じ定義を使用したいと思います。両方のプロジェクトが大きなプロジェクトの一部であるので、C++ファイルに変更(追加/削除)があれば、対応するC#ファイルにも反映されるはずです。私は2つのファイルを同期させておきたい。私は、これを行うためのスクリプト/ツールがあるかどうか疑問に思っていました。簡単なC++コードを自動的にC#に変換する

リバースソリューション(C#→C++)でも動作します。

明確化:

現在のコードは次のとおりです。

//C++ 
    struct Colors{ 
     static const int Red = 100; //Custom Values are important 
     static const int Green = 101; } 
//C# 

public enum Color{ Red = 100; Green =101; } 

は今、私はC++でのすべての変更をC#(またはその逆)に反映されるように、1つのファイルを持っていたい、私はできるように、これらの定数のプロジェクト間に1つのファイルがあります。

ご覧のとおり、C++のstructに定義されている定数の束をC#の列挙型にマップしたいと考えています。上記の構造に(他のコードに依存する)他のコードがあるので、上記の期待された定義には/最小限の変更を加えたくなります(現在の形式でこれを達成する良い方法がない場合は、それを行うかもしれません)

+0

どのような定数ですか?最も重要なのは、どのデータ型が関与しているかです。短いサンプルスニペットも便利です。 –

+0

偉大なあなたが尋ねた!現在のコードは // C++ です。構造体の色{ static const int Red = 100; //カスタム値は重要です static const int緑色= 101; } 上記から私はC#に行きたい: public enum Color { 赤い= 100; 緑色= 101; } ご覧のとおり、C++のstructに定義されている定数の束をC#の列挙型にマップしたいと思います。上記の構造に(他のコードに依存している)他のコードが存在するので、上記の期待される定義には/最小限の変更を加えたくなります(現行の形式でこれを達成する良い方法がない場合は可能です)。 –

答えて

1

あなたはおそらくスクリプトを見つけません...これを行うには独自のスクリプトが必要です。それ以外の場合は、MACROが最適です...
スクリプトをお持ちの場合は、プロジェクトをビルドするたびにこのスクリプトを自動的に実行するルールをメイクファイルに作成することができます。

+0

私は実際にはプリプロセッサの指令ではなく、MACROではありません。この文脈では、 "MACRO"はおそらくC++にもっと付随しています – FatDaemon

4

定数ファイルをApp.Constants.dllのようなアセンブリとして個別にパッケージ化し、C#プロジェクトとC++プロジェクトの両方で参照するのはなぜですか?このようにして、1か所で変更を加えることができます。プロジェクトベースのリファレンスを用意してVisual Studioで簡単に作成できます。

+0

これは管理されたC++(本当にC++ではない)を使用する必要がありますか? – bdonlan

+0

@bdonlanアンマネージドC++も使用できると確信しています。本気ですか? –

+0

あなたは管理されたラッパーをまだ持っていない既存のWindowsライブラリと同じように、通常のC++ライブラリから物事をpInvokeできるはずです。 – jrista

1

単純な定数を仮定すると、同じソースファイルを創造的にプリプロセッサを使って再利用できるはずです。このような何か:

#if CSHARP 
public class Constants { 
#else 
# define public 
#endif 

// Easy stuff 
public const int FOO = 1; 
public const int BAR = 2; 

// Enums can be done too, but you have to handle the comma 
public enum Color { COLOR_RED, COLOR_GREEN, COLOR_BLUE } 
#if !CSHARP 
; 
#endif 

#if CSHARP 
} 
#else 
# undef public 
#endif 

自分の名前(例えばtypedef unsigned int uint)と一致するように、あなたはいくつかのタイプのためのtypedefが必要になる場合があります。

次に、C#プロジェクトの一部としてコードを/define:CSHARPでコンパイルし、さらに#includeを追加の定義なしでC++ヘッダーにコンパイルします。

+0

これは素晴らしい方法ですが、私の場合は本当に面倒なコードにつながります。 –

1

あなたがしたいのは、アンマネージC++とC#の両方で再利用可能な形式で定数と列挙型を含むマネージC++ライブラリを作成することです。

マネージドバージョン:

//managed.cpp 
#define MAKECONST(name, value) public const int ##name = ##value; 

public enum class FruitType 
{ 
    #include "FruitType.h" 
}; 

pubilc ref class Constants { 
    #include "const.h" 
}; 

管理されていないバージョン:

//unmanaged.cpp 
#define MAKECONST(name, value) const int ##name = ##value; 

enum FruitType 
{ 
    #include "FruitType.h" 
}; 

#include "const.h" 

実際の列挙型の定義:

//FruitType.h 
Apple = 1, 
Banana, 
Lychee 

constsファイル:

​​
0

SWIGを使用してC++コードをC#に変換する自動化方法。

関連する問題