Convertendo simples código C ++ para C # automaticamente
-
06-07-2019 - |
Pergunta
Eu tenho um arquivo em C ++ que contém definições constantes, eu quero usar as mesmas definições em um projeto C #. Uma vez que ambos os projetos são parte de um projeto maior, eu quero, se houver uma alteração (adição / exclusão) no arquivo do C ++ deve se reflete em muito ficheiro C # correspondente. Quero manter os 2 arquivos em sincronia. Eu queria saber se existe um script / ferramenta para fazer isso.
A solução inversa (C # -> C ++). Também funcionaria
Esclarecimento:
Atualmente, o código é:
//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; }
Agora eu quero ter um único arquivo para que quaisquer alterações em C ++ são refletidos em C # (ou contrário) para que eu possa ter um único arquivo através dos projectos para essas constantes.
Como você vê, eu quero mapear monte de constantes definidas em um struct em C ++ para um enum em C #. Eu quero fazer nenhuma mudança / mínimas em cima definições esperados como não há outro código dependente (em ambos os projetos) sobre as estruturas acima (mas pode fazê-lo, se não é uma boa maneira de fazer isso no formato atual)
Solução
Você provavelmente não vai encontrar um script ... Você deve ter o seu próprio script para fazer isso. Caso contrário, as macros são o melhor ajuste ...
Se você tem um roteiro, então você pode criar uma regra no seu makefile que irá executar automaticamente o script sempre que você construir seu projeto.
Outras dicas
Por que você não levar o arquivo constantes e empacotá-lo separadamente como um algo a montagem como App.Constants.dll e têm ambos C # e C ++ projectos referenciá-los? Desta forma, você pode fazer a mudança em um só lugar. Ter referências baseados em projetos para tornar mais fácil no Visual Studio.
Assumindo constantes inteiras simples e tal, deve ser possível reutilizar o mesmo arquivo de origem usando pré-processador criativamente. Algo parecido com isto:
#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
Você pode precisar de typedefs para alguns tipos de modo que seus nomes correspondem (por exemplo typedef unsigned int uint
).
Em seguida, você compilar o código como parte de seu projeto C # com /define:CSHARP
, e também #include
-lo em alguns C ++ cabeçalho sem define adicionais.
O que você quer fazer é criar uma biblioteca C ++ gerenciado que contém as constantes e enums em um formato que é reutilizável em ambos não gerenciado C ++ e C #.
Versão gerenciado:
//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"
};
Versão não gerenciado:
//unmanaged.cpp
#define MAKECONST(name, value) const int ##name = ##value;
enum FruitType
{
#include "FruitType.h"
};
#include "const.h"
As definições enum real:
//FruitType.h
Apple = 1,
Banana,
Lychee
O arquivo consts:
//consts.h
MAKECONST(NumFruitInABowl, 3)
MAKECONST(NumBowls, 2)
Um método automatizado de fazer isso, ele usar SWIG para converter seu código C ++ para C #.