C++ 열거 형을 C#으로 가져 오기


14

저는 현재 구형 C++ 응용 프로그램과 상호 작용해야하는 새로운 C# 프로젝트를 만드는 중입니다. 이미 C# 응용 프로그램에서 C# 응용 프로그램에서 사용해야하는 오류 열거 형이 있습니다.

파일을 함께 업데이트하지 않으면 동기화 문제가 발생할 수 있으므로 C#에서 열거 형을 다시 선언하고 싶지 않습니다..

typedef enum 
{ 
    eDEVICEINT_ERR_FATAL = 0x10001 
    ... 
} eDeviceIntErrCodes; 

등 같은 C# 프로그램에서 사용 :

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
을 촬영 열거에 저를위한 방법이과 같이 선언 :

은 그 모든 존재는 내 질문이 말했다

12

PInvoke Interop Assistant 도구 http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120을 확인하십시오. 원시 메소드에 대한 PInvoke 서명을 생성하는 데 유용한 도구입니다.

피드를 열거하면이 코드가 생성됩니다. C++ 버전이 바뀔 때마다 열거 형의 C# 정의를 최신 상태로 유지할 수있는 자동화 된 프로세스를 만들 수 있도록 도구의 명령 줄 버전이 포함되어 있습니다.

당신이 좋아하는 열거 선언했다면

    public enum eDeviceIntErrCodes 
    { 
     /// eDEVICEINT_ERR_FATAL -> 0x10001 
     eDEVICEINT_ERR_FATAL = 65537, 
    } 

2

간단한 대답은 아니오가 될 것입니다. 죄송합니다. 다시 신고해야합니다.

그러나 저는 C++ enum을 enums.cs 파일의 C# 형식으로 가져 와서 빌드의 일부로 실행하는 스크립트를 작성했습니다. 모든 것이 동기화됩니다.


0

:

namespace blah 
{ 
    enum DEVICE_ERR_CODES 
    { 
     eDEVICEINT_ERR_FATAL = 0x10001, 
     eDEVICEINT_ERR_OTHER = 0x10002, 
    }; 
}

다른 파일 :

DEVICE_ERR_CODES eDeviceIntErrCodes;

을하고 .cs 확장자를 가진 열거 파일 이름, 당신은 할 수 있습니다 그것을 작동 시키십시오. 당신은 그것을 좋아 참조 할 것 : 당신이 열거 정의를 포함하는 .cs 파일을 #include를 수있는 C/C++에서

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

12

합니다. 처리기 지시문의주의 깊은 사용은 C# 및 C. 사이의 구문 차이를 돌봐

: 당신의 C# 프로젝트에서

#if CSharp 
namespace MyNamespace.SharedEnumerations 
{ 
public 
#endif 


enum MyFirstEnumeration 
{ 
    Autodetect = -1, 
    Windows2000, 
    WindowsXP, 
    WindowsVista, 
    OSX, 
    Linux, 

    // Count must be last entry - is used to determine number of items in the enum 
    Count 
}; 
#if CSharp 
public 
#endif 

enum MessageLevel 
{ 
    None,   // Message is ignored 
    InfoMessage, // Message is written to info port. 
    InfoWarning, // Message is written to info port and warning is issued 
    Popup   // User is alerted to the message 
}; 

#if CSharp 
    public delegate void MessageEventHandler(MessageLevel level, string message); 
} 
#endif 

는, 조건부 컴파일 기호 "CSHARP"하게 설정 확실히 그런 처리기 정의는 존재하지 않는다 C/C++ 빌드 환경에서.

이렇게하면 빌드시 두 부품이 모두 동기화됩니다. 서로 다른 빌드의 바이너리를 섞어서 일치 시키면 보장이 실패합니다.