2009-07-30 5 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++의 struct에 정의 된 상수를 C#의 열거 형에 매핑하려고합니다. 위의 구조에 다른 코드가 종속되어 있으므로 위의 예상 된 정의에서 아무런/최소한의 변경도하고 싶습니다 (그러나 현재의 형식으로이 작업을 수행하는 좋은 방법이 없으면 수행 할 수도 있음)

+0

어떤 종류의 상수입니까? 가장 중요한 것은 어떤 데이터 유형이 관련되어 있습니까? 짧은 샘플 스 니펫도 편리 할 것입니다. –

+0

위대한 당신이 물었다! 현재 코드는 다음과 같습니다. // C++ 구조체 색상 { static const int Red = 100; // 사용자 지정 값은 중요합니다. static const int 녹색 = 101; } 위에서 C에서 얻고 싶습니다. # public enum Color { Red = 100; 초록 = 101; } 아시다시피 C++의 struct에 정의 된 상수를 C#의 열거 형에 매핑하려고합니다. 위의 구조에 다른 코드가 (두 프로젝트 모두에) 종속되어 있으므로 위의 예상 된 정의에서 아무런/최소한의 변경도하고 싶습니다 (그러나 현재 형식으로이 작업을 수행하는 좋은 방법이 없다면 수행 할 수도 있음) –

답변

1

아마 스크립트를 찾지 못할 것입니다. 스크립트를 직접 작성해야합니다. 그렇지 않으면 MACRO가 가장 적합합니다 ...
스크립트가있는 경우 프로젝트를 빌드 할 때마다이 스크립트를 자동으로 실행하는 규칙을 메이크 파일에 만들 수 있습니다.

+0

오, 나는 실제로 전 처리기 지시문을 사용하고 MACRO는 사용하지 않습니다. "MACRO"는 아마도이 맥락에서 C++에 더 많이 붙어있을 것입니다. – FatDaemon

4

상수 파일을 App.Constants.dll과 같은 어셈블리로 별도로 패키지화하고 C# 및 C++ 프로젝트에서 참조하도록해야하는 이유는 무엇입니까? 이렇게하면 한 곳에서 변화를 줄 수 있습니다. 프로젝트 기반 참조를 통해 Visual Studio에서 쉽게 사용할 수 있습니다.

+0

관리되는 C++ (실제로 C++이 아닙니다)를 사용해야합니다. – bdonlan

+0

@bdonlan 관리되지 않는 C++도 사용할 수 있다고 확신합니다. 확실합니까? –

+0

관리되는 래퍼가없는 기존 Windows 라이브러리와 마찬가지로 일반 C++ 라이브러리의 내용을 pInvoke 할 수 있어야합니다. – jrista

1

정수형 상수 등을 가정하면 전처리기를 독창적으로 사용하여 동일한 소스 파일을 재사용 할 수 있어야합니다. 이런 식으로 뭔가 : 이름 (예를 들어 typedef unsigned int uint)와 일치하도록

#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 

당신은 어떤 유형의 형식 정의가 필요할 수 있습니다.

다음 코드를 /define:CSHARP으로 C# 프로젝트의 일부로 컴파일하고 추가 정의없이 일부 C++ 헤더에 #include을 컴파일합니다.

+0

이것은 좋은 방법이지만 내 특별한 경우에 정말 지저분한 코드로 이어질 것입니다. –

1

원하는 것은 관리되지 않는 C++과 C# 모두에서 재사용 가능한 형식으로 상수와 enum을 포함하는 관리되는 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는 파일 :

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

SWIG을 사용하여 C++ 코드를 C#으로 변환하는 자동화 된 방법입니다.