Domanda

Ho un file in C ++ che contiene definizioni costanti, voglio usare le stesse definizioni in un progetto C #. Dato che entrambi i progetti fanno parte di un progetto più grande, voglio che ci sia una modifica (aggiunta / eliminazione) nel file C ++ che dovrebbe riflettersi anche nel file C # corrispondente. Voglio mantenere sincronizzati i 2 file. Mi chiedevo se ci fosse uno script / uno strumento per farlo.

Funzionerebbe anche una soluzione inversa (C # - > C ++).

Chiarimento:

Attualmente il codice è:

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

Ora voglio avere un singolo file in modo che eventuali modifiche in C ++ si riflettano in C # (o viceversa) in modo da poter avere un singolo file attraverso i progetti per queste costanti.

Come vedi, voglio mappare un gruppo di costanti definite in una struttura in C ++ a un enum in C #. Voglio apportare modifiche minime / minime nelle definizioni sopra previste in quanto esiste un altro codice dipendente (in entrambi i progetti) dalle strutture sopra (ma potrebbe farlo, se non c'è un buon modo per farlo nel formato corrente)

È stato utile?

Soluzione

Probabilmente non troverai uno script ... Dovresti avere il tuo script per farlo. Altrimenti i MACRO sono la soluzione migliore ...
Se hai uno script, puoi creare una regola nel tuo makefile che eseguirà automaticamente questo script ogni volta che costruisci il tuo progetto.

Altri suggerimenti

Perché non prendi il file constants e lo impacchetti separatamente come assembly qualcosa come App.Constants.dll e fai riferimento sia ai progetti C # che c ++? In questo modo, puoi apportare modifiche in un unico posto. Avere riferimenti basati su progetti per semplificare in Visual Studio.

Supponendo costanti intere semplici e simili, dovrebbe essere possibile riutilizzare lo stesso file sorgente usando il preprocessore in modo creativo. Qualcosa del genere:

#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

Potresti aver bisogno di typedef per alcuni tipi in modo che i loro nomi corrispondano (ad es. typedef unsigned int uint ).

Quindi compili il codice come parte del tuo progetto C # con / define: CSHARP , e anche #include in qualche intestazione C ++ senza ulteriori definizioni.

Quello che vuoi fare è creare una libreria C ++ gestita che contenga costanti ed enumerazioni in un formato riutilizzabile sia in C ++ non gestito che in C #.

Versione gestita:

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

Versione non gestita:

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

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

#include "const.h"

Le attuali definizioni enum:

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

Il file consts:

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

Un metodo automatizzato per farlo per usare SWIG per convertire il tuo codice C ++ in C #.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top