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)

Foi útil?

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 #.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top