Преобразование простого кода C ++ в C # автоматически - PullRequest
4 голосов
/ 31 июля 2009

У меня есть файл в 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 #. Я хочу не вносить / минимизировать изменения в вышеупомянутых ожидаемых определениях, поскольку существует другой код, зависящий (в обоих проектах) от вышеуказанных структур (но может сделать это, если в текущем формате нет хорошего способа сделать это)

Ответы [ 5 ]

4 голосов
/ 31 июля 2009

Почему бы вам не взять файл констант и не упаковать его отдельно как сборку, например, в App.Constants.dll, и чтобы проекты C # и c ++ ссылались на них? Таким образом, вы можете внести изменения в одном месте. Иметь ссылки на проекты, чтобы упростить работу в Visual Studio.

1 голос
/ 31 июля 2009

То, что вы хотите сделать, - это создать управляемую библиотеку 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"

Фактические определения enum:

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

Файл conts:

//consts.h
MAKECONST(NumFruitInABowl, 3)
MAKECONST(NumBowls, 2)
1 голос
/ 31 июля 2009

Вы, вероятно, не найдете сценарий ... У вас должен быть свой сценарий для этого. В противном случае MACRO лучше всего подходят ...
Если у вас есть сценарий, вы можете создать правило в своем make-файле, которое будет автоматически запускать этот сценарий при создании проекта.

1 голос
/ 31 июля 2009

Предполагая простые целочисленные константы и тому подобное, должна быть возможность повторно использовать один и тот же исходный файл с помощью творческого использования препроцессора. Примерно так:

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

Затем вы компилируете код как часть вашего проекта C # с помощью /define:CSHARP, а также #include его в некоторый заголовок C ++ без дополнительных определений.

0 голосов
/ 31 июля 2009

Автоматический способ сделать это с помощью SWIG для преобразования вашего кода C ++ в C #.

...