2009-07-30 8 views
4

Ich habe eine Datei in C++, die konstante Definitionen enthält. Ich möchte dieselben Definitionen in einem C# -Projekt verwenden. Da beide Projekte Teil eines größeren Projekts sind, möchte ich, wenn es eine Änderung (Addition/Deletion) in der C++ - Datei gibt, sollte es auch in der entsprechenden C# -Datei reflektiert werden. Ich möchte die 2 Dateien synchron halten. Ich habe mich gefragt, ob es ein Skript/Werkzeug dafür gibt.Konvertieren von einfachem C++ - Code in C# automatisch

Eine umgekehrte Lösung (C# -> C++) würde auch funktionieren.

Klarstellung:

Derzeit ist der Code:

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

Jetzt habe ich so eine einzelne Datei haben will, dass alle Änderungen in C++ in C# reflektiert werden (oder umgekehrt), so dass ich kann habe eine einzige Datei über die Projekte für diese Konstanten.

Wie Sie sehen, möchte ich Bündel von Konstanten, die in einer Struktur in C++ definiert sind, einer Aufzählung in C# zuordnen. Ich möchte keine/minimale Änderungen in den oben erwarteten Definitionen machen, da es anderen Code abhängig (in beiden Projekten) auf den obigen Strukturen gibt (aber könnte es tun, wenn es keine gute Möglichkeit gibt, dies im aktuellen Format zu erreichen)

+0

Welche Arten von Konstanten? Am wichtigsten, welche Datentypen sind beteiligt? Ein kurzer Beispielschnipsel wäre ebenfalls hilfreich. –

+0

Toll, dass Sie gefragt haben! Zurzeit lautet der Code: // C++ struct Farben { statisch const int Rot = 100; // Benutzerdefinierte Werte sind wichtig static const int Grün = 101; } Von den oben genannten möchte ich in C#: öffentlichen enum Farbe { Red = 100; Grün = 101; } Wie Sie sehen, möchte ich Bündel von Konstanten, die in einer Struktur in C++ definiert sind, einer Aufzählung in C# zuordnen. Ich möchte keine/minimale Änderungen in den oben erwarteten Definitionen machen, da es anderen Code (in beiden Projekten) auf den obigen Strukturen gibt (aber könnte es tun, wenn es keine gute Möglichkeit gibt, dies im aktuellen Format zu erreichen) –

Antwort

1

Sie werden wahrscheinlich kein Skript finden ... Sie sollten Ihr eigenes Skript dafür haben. Ansonsten sind MACROS die beste Lösung ...
Wenn Sie ein Skript haben, können Sie in Ihrem Makefile eine Regel erstellen, die dieses Skript automatisch ausführt, wenn Sie Ihr Projekt erstellen.

+0

ohh ich tatsächlich PreProcessor Richtlinien und nicht MACROs. "MACRO" ist in diesem Zusammenhang wahrscheinlich eher an C++ gebunden – FatDaemon

4

Warum nehmen Sie nicht die Konstanten-Datei und packen sie separat als Assembly so etwas wie App.Constants.dll und haben beide C# - und C++ - Projekte auf sie verweisen? Auf diese Weise können Sie Änderungen an einem Ort vornehmen. Haben Sie projektbasierte Referenzen, um es in Visual Studio einfach zu machen.

+0

Dies würde die Verwendung von verwaltetem C++ (was überhaupt kein C++ ist), sicher? – bdonlan

+0

@bdonlan Ich bin sicher, dass Sie auch unmanaged C++ verwenden können. Bist du sicher? –

+0

Sie sollten in der Lage sein, Dinge aus einer normalen C++ - Bibliothek zu pInvozieren, ähnlich wie bei bestehenden Windows-Bibliotheken, die noch keinen verwalteten Wrapper haben. – jrista

1

Unter der Annahme von einfachen Integer-Konstanten und solchen sollte es möglich sein, die gleiche Quelldatei durch kreatives Verwenden des Präprozessors wiederzuverwenden. Etwas wie folgt aus:

#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 

Sie könnten typedefs für einige Arten benötigen, so dass ihre Namen übereinstimmen (z typedef unsigned int uint).

Dann kompilieren Sie Code als Teil Ihres C# -Projekts mit /define:CSHARP, und auch #include es in einige C++ - Header ohne zusätzliche definiert.

+0

Dies ist eine großartige Möglichkeit, würde aber in meinem speziellen Fall zu wirklich unordentlichem Code führen. –

1

Sie möchten eine verwaltete C++ - Bibliothek erstellen, die die Konstanten und Enums in einem Format enthält, das sowohl in nicht verwaltetem C++ als auch in C# wiederverwendbar ist.

Managed Version:

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

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

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

#include "const.h" 

Die tatsächlichen Enum-Definitionen:

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

Die consts Datei:

//consts.h 
MAKECONST(NumFruitInABowl, 3) 
MAKECONST(NumBowls, 2) 
0

Eine automatisierte Methode, dies zu tun, um SWIG zu verwenden, um Ihren C++ - Code in C# umzuwandeln.