Автоматическое преобразование простого кода C++ в C#

StackOverflow https://stackoverflow.com/questions/1209528

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top