Автоматическое преобразование простого кода C++ в C#
-
06-07-2019 - |
Вопрос
У меня есть файл на C++, содержащий определения констант, я хочу использовать те же определения в проекте C#.Поскольку оба проекта являются частью более крупного проекта, я хочу, чтобы изменения (добавление/удаление) в файле 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#.Я хочу внести никакие/минимальные изменения в ожидаемые выше определения, поскольку существует другой код, зависящий (в обоих проектах) от вышеуказанных структур (но я могу это сделать, если нет хорошего способа сделать это в текущем формате).
Решение
Скрипта вы вряд ли найдете...Для этого у вас должен быть собственный сценарий.В противном случае МАКРО подходят лучше всего...
Если у вас есть сценарий, вы можете создать в своем make-файле правило, которое будет автоматически запускать этот сценарий при каждой сборке проекта.
Другие советы
Почему бы вам не взять файл констант и не упаковать его отдельно как сборку, например App.Constants.dll, и не сделать так, чтобы на них ссылались проекты C# и C++?Таким образом, вы можете внести изменения в одном месте.Имейте ссылки на проекты, чтобы упростить работу в Visual Studio.
Предполагая простые целочисленные константы и тому подобное, должна быть возможность повторно использовать один и тот же исходный файл, творчески используя препроцессор.Что-то вроде этого:
#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++ без каких-либо дополнительных определений.
Вам нужно создать управляемую библиотеку 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"
Фактические определения перечислений:
//FruitType.h
Apple = 1,
Banana,
Lychee
Файл констант:
//consts.h
MAKECONST(NumFruitInABowl, 3)
MAKECONST(NumBowls, 2)
Автоматизированный метод сделать это можно использовать СВИГ для преобразования вашего кода C++ в C#.