簡単なC ++コードからC#への自動変換
-
06-07-2019 - |
質問
定数定義を含むC ++のファイルがあります。C#プロジェクトで同じ定義を使用したいです。両方のプロジェクトがより大きなプロジェクトの一部であるため、C ++ファイルに変更(追加/削除)がある場合、対応するC#ファイルにも反映される必要があります。 2つのファイルの同期を保ちたい。これを行うスクリプト/ツールがあるかどうか疑問に思っていました。
逆ソリューション(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#(または他の方法)に反映されるように単一のファイルを作成して、これらの定数のプロジェクト全体で単一のファイルを使用できるようにします。
ご覧のとおり、C ++の構造体で定義されている定数の束をC#の列挙型にマップします。上記の構造には(両方のプロジェクトで)他のコード依存があるため、上記の予想される定義に変更を加えない/最小限にしたい(しかし、現在の形式でこれを達成する良い方法がない場合は行うかもしれない)
解決
おそらくスクリプトを見つけられません...これを行うには、独自のスクリプトが必要です。それ以外の場合は、MACROが最適です...
スクリプトがある場合は、プロジェクトをビルドするたびにこのスクリプトを自動的に実行するルールをメイクファイルに作成できます。
他のヒント
なぜ定数ファイルを取得し、App.Constants.dllのようなアセンブリとして個別にパッケージ化し、C#プロジェクトとc ++プロジェクトの両方がそれらを参照するのですか?このようにして、1か所で変更を加えることができます。プロジェクトベースの参照を用意して、Visual Studioで簡単に作成できるようにします。
単純な整数定数などを想定すると、プリプロセッサを創造的に使用することにより、同じソースファイルを再利用できるはずです。このようなもの:
#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が必要になる場合があります(例: typedef unsigned int uint
)。
次に、 / define:CSHARP
を使用してC#プロジェクトの一部としてコードをコンパイルし、追加の定義なしで #include
をC ++ヘッダーにコンパイルします。
やりたいことは、アンマネージ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ファイル:
//consts.h
MAKECONST(NumFruitInABowl, 3)
MAKECONST(NumBowls, 2)
これを行う自動化された方法で、 SWIG を使用してC ++コードをC#に変換します。