문제

네이티브 (관리되지 않은) C ++와 (관리) C#사이에 열거 정의를 공유하는 방법이 있습니까?

완전히 관리되지 않는 코드에 다음 열거가 사용됩니다.

enum MyEnum { myVal1, myVal2 };

응용 프로그램은 때때로 관리 구성 요소를 사용합니다. C# 구성 요소는 관리 된 C ++ 인터 로프 DLL (기본 DLL)을 통해 열거 항목 값을 int로 가져옵니다. (인터 로프 DLL은 C# 구성 요소가 필요한 경우에만로드됩니다.) C# 구성 요소는 열거 된 정의를 복제했습니다.

public enum MyEnum { myVal1, myVal2 };

기본 C ++ DLL을 관리되는 DLL로 바꾸지 않고 복제를 제거하는 방법이 있습니까?

도움이 되었습니까?

해결책

단일 .CS 파일을 사용하여 두 프로젝트간에 공유 할 수 있습니다. #include .CS 파일의 C ++에서는 아무런 문제가 없어야합니다.

이것은 예 .CS 파일입니다.

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };

#if !__LINE__
}
#endif

하나의 파일로 여러 열거를 원한다면이 작업을 수행 할 수 있습니다 (C / C ++에 대한 대중을 일시적으로 정의해야하지만) :

#if __LINE__
#define public
#else
namespace MyNamespace
{
#endif

    public enum MyEnum { MyEnumValue1, MyEnumValue2 };
    public enum MyEnum2 { MyEnum2Value1, MyEnum2Value2 };
    public enum MyEnum3 { MyEnum3Value1, MyEnum3Value2 };

#if __LINE__
#undef public
#else
}
#endif

다른 팁

공유해 주셔서 감사합니다!

나는 약간의 연주를했고, 수많은 추가 라인이 없으면 여러 개의 열거와 일정한 선언을 할 수있는 방법을 찾았습니다. :)

// This is a valid C, C++ and C# file :)
#if __LINE__
#define public
#else
namespace MyCSharpNamespace{
#endif

    public enum MyConstant { MaxStr = 256 };
    public enum MyEnum1{ MyEnum1_A, MyEnum1_B };
    public enum MyEnum2{ MyEnum2_A, MyEnum2_B };

#if __LINE__
#undef public
#else
}
#endif

파일 *.cs의 이름을 지정하십시오

C# 라이브러리를 COM에 노출 한 다음 유형 라이브러리를 관리되지 않는 코드로 가져올 수 있습니다.이 방법으로 관리되지 않은 라이브러리의 C# 라이브러리에 정의 된 열거를 사용할 수 있습니다.

관리되지 않는 C ++ 및 C#은 두 가지 다른 세계에서 살고 있으므로 C ++ DLL을 관리되는 하나로 변경하지 않고도 동일한 열거를 사용할 방법이 없습니다.

그럼에도 불구하고 관리되는 C ++ DLL에서 복제가 필요할 것입니다.

C ++ 열거는 상수 목록과 매우 유사하지만 C# 열거는 열거 클래스를 상속하므로 상당히 "트릭"을 제공합니다. 보시다시피, 그들은입니다 매우 다른.

기본 C ++ DLL이 기본이든 관리되는지 여부에 관계없이 문제가되지 않으면 관리가 관리되는 C ++ 레이어 안에 기본 통화를 감싸고 있습니다.

이렇게하면 C ++ DLL 내부에 열거 복제를 할 수 있으며 동시에 모든 인터 로프를 제거 할 수 있습니다. :-)

나는 과거에도 같은 문제를 겪었고 전처리 정의를 사용하여 해결했습니다.

관리되지 않은 코드에서 관리되는 래퍼가 포함시킬 수있는 헤더 내부에 열거 항목을 #Define에 넣으십시오.

그런 다음 관리 및 관리되지 않는 열거 정의에서 두 사용에 대해 동일한 #Define을 사용하십시오.

관리되지 않는 세상과 관리되지 않는 세계 사이의 열거의 움직임은 약간 불쾌 해 보이지만 (기본적으로 캐스트가 필요합니다), 관리되지 않은 세상의 발신자에게는 잘 보이고 느껴질 것입니다.

행운을 빕니다,

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top