2009-07-30 2 views
4

У меня есть файл на C++, содержащий постоянные определения, я хочу использовать те же определения в проекте C#. Поскольку оба проекта являются частью более крупного проекта, я хочу, если в файле C++ есть изменение (добавление/удаление), оно также должно быть отражено в соответствующем файле C#. Я хочу сохранить 2 файла в синхронизации. Мне было интересно, есть ли сценарий/инструмент для этого.Преобразование простого кода C++ в C# автоматически

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

+0

Какие постоянные? Самое главное, какие типы данных задействованы? Короткий образец фрагмента также будет полезен. –

+0

Отлично, что вы спросили! В настоящее время используется код: // C++ struct Colors { static const int Red = 100; // Важные значения важны static const int Green = 101; } Из вышеизложенного я хочу попасть в C#: public enum Цвет { Красный = 100; Green = 101; } Как вы видите, я хочу отобразить кучу констант, определенных в структуре на C++, на перечисление в C#. Я хочу, чтобы в предыдущих ожидаемых определениях не было никаких минимальных изменений, поскольку в вышеупомянутых структурах существует другой зависимый от кода (в обоих проектах) (но может сделать это, если нет хорошего способа выполнить это в текущем формате) –

ответ

1

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

+0

ohh i на самом деле инструкции PreProcessor, а не MACRO. «MACRO», вероятно, больше привязан к C++ в этом контексте – FatDaemon

4

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

+0

Это будет требуют использования управляемого C++ (что на самом деле не является C++ вообще), неужели? – bdonlan

+0

@bdonlan Я уверен, что вы также можете использовать неуправляемый C++. Ты уверен? –

+0

Вы должны иметь возможность pInvoke вещи из обычной библиотеки C++, так же, как и существующие библиотеки Windows, которые еще не имеют управляемой оболочки. – jrista

1

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

#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 unsigned int uint).

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

+0

Это отличный способ, но приведет к действительно запутанному коду в моем конкретном случае. –

1

Что вы хотите сделать, это создать управляемую библиотеку C++, которая содержит константы и перечисления в формате, который может использоваться повторно как на неуправляемых C++, так и на C#.

Managed версия:

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

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

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

файл The consts:

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

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

Смежные вопросы