2010-12-28 6 views
3

c로 작성된 dll을 사용하고 있습니다. 내 모든 C# 프로그램에 필요한 기능을 가져 왔습니다. 대부분의 기능은 제대로 작동하지만 몇 가지 문제가 있습니다. 문제가있는 함수는 입력으로 구조체가 필요합니다. C#에서이 구조체를 정의해야한다고 가정합니다.하지만이 구조체는 혼란 스럽기 때문에 내가 시도한 것을 남겨 둘 것입니다. 구조체는 상당히 길다 그래서 것입니다 단순히 C에서의 모습 :dll에서 c struct를 C#으로 변환

typedef struct chain_link_info 
{ 
    unsigned short command; 
    unsigned long* buff_id; 
    FLAGS_TYPES flags; // this is a union that i will list below 
} CHAIN_LINK_INFO; 

typedef union flags_type 
{ 
    unsigned long ulong; 

    struct 
    { 
    unsigned short std_flags; 
    unsigned short high 
    } ushort; 

    struct 
    { 
    unsigned int a : 1; 
    unsinged int b : 1; 
    unsinged int c : 1; 
    unsinged int d : 1; 
    unsinged int e : 2; 
    unsinged int f : 1; 
    unsinged int g : 1; 
    unsinged int h : 1; 
    unsinged int i : 1; 
    unsinged int j : 1; 
    unsinged int k : 1; 
    unsinged int l : 1; 
    unsinged int m : 1; 
    unsinged int n : 1; 
    unsinged int o : 1; 
    unsigned int high_word :16 
    } std_bits; 
} FLAGS_TYPE; 

C#에서이 stucts을 정의하는 적절한 방법은 무엇입니까? 감사합니다

+1

이 경우 [StructLayout] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx)이 재생되지만 들어올 수는 없다고 생각합니다. 양. –

+0

죄송합니다 downvote, 나는 그것을 제거했습니다. 우연히 클릭해야합니다. 노동 조합이 어떻게 매핑되는지 궁금합니다. –

답변

1

C# 구조체를 만들고이 구조체에 [StructLayout]을 적용한 다음 C와 같은 순서로 필드를 나열합니다. FLAGS_TYPE 구조체의 경우 필드에 [FieldOffset] 특성을 사용해야합니다. 공용체의 모든 멤버는 동일한 메모리 주소에서 시작하므로 동일한 [FieldOffset (0)]을 적용합니다.

업데이트 : 이제 형식화되었으므로, 당신은 전혀 노동 조합을 사용할 필요가 없다고 생각합니다. 하나의 32 비트 정수를 사용하고 비트 필드 연산을 사용하여 다른 필드를 얻으면보다 안전합니다.

+0

예, "C에서 구조를 정의하는 올바른 방법은 무엇입니까?" ;-) –

1

C 선언이 유효하지 않으므로 좋은 대답을 내기가 어렵습니다. 일반적으로 비트 필드는 처리 할 수 ​​없지만이 특별한 경우에는 모두 8 비트의 배수이기 때문에 작동합니다. [StructLayout (LayoutKind.Explicit)]가 필요하고 각 필드에 [FieldOffset (x)]을 사용하십시오. 잘못 명명 된 부호없는 long, std_flags 및 a는 오프셋 0에 있습니다. b는 1. high 및 high_word 2입니다.

+0

내 사과 좀 더 실제 구조체처럼 조금 질문을 해결했습니다. 원래 스트럿츠는 상당히 크기 때문에 간단한 답변만으로도 내가 뭘 잘못하고 있는지 알 수 있기를 바랄뿐입니다. 고맙습니다. – poco

+0

음, 비트 필드는 더 이상 8의 행복한 배수가 아닙니다. &와 |를 사용해야합니다. 연산자를 사용하면 개별 비트를 가져 오거나 설정할 수 있습니다. –

0

FieldOffset은 바이트 단위입니다. 따라서 최대 FieldOffset까지만 바이트를 표시 할 수 있습니다. FieldOffset을 직접 만들 수도 있습니다.

관련 문제