복잡한 데이터 구조를받는 UDP 클라이언트를 작성하고 있습니다. C++로 구조체를 가지고 있지만 내 프로그램은 C#으로되어 있습니다.C++에서 C++로 구조체를 이전하는 방법
Bitfiels 및 공용체에는 많은 구조가 있습니다.
구조체를 손으로 변환 할 필요가없는 방법이 있습니까?
또한 C#에서 Bitfields 및 Union을 구현하는 쉬운 방법이 있습니까?
지금은 Bitfields의 등록 정보를 사용하고 있지만 실수가있을 가능성이있는 어려운 작업입니다.
제가 지금하고있는 간단한 예제를 제공했습니다. 약 100 줄의 코드가있는 약 50 개의 구조체가 있습니다.
예 : C++ :
typedef struct Message_s
{
unsigned char var : 2;
unsigned char var2 : 6;
union
{
struct
{
unsigned char sVar;
unsigned char sVar2;
}
char arr[32];
}
}Message_t;
예 C 번호 :
는 짧은 대답이 '아니오'[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
struct Message_s
{
private byte Field1
public byte var
{
get
{
return (byte)(Field1 & 0x03);
}
set
{
Field1 = (byte)((Field1 & ~0x03) | value);
}
public byte var2
{
get
{
return (byte)(Field1 & 0xFC);
}
set
{
Field1 = (byte)((Field1 & 0x03) | value<<2);
}
}
//unions may be possible with properties...
}
비트 필드 조작에 관해서는 System.Collections.Specialized.BitVector32를 참조하십시오. 또한 수행중인 작업에 따라 적절한 너비의 열거 형을 사용하여 Flags 특성으로 꾸미기를 원할 수 있습니다. – JamieSee
ok 이것에 대해 : 모든 구조체를 조작하는 manged C++ DLL을 작성하면 C#에서 액세스 할 수 있습니다. 그렇습니까? 또 다른 질문은 C++ 컴파일러가 구조체의 바이트와 비트 순서를 유지합니까? –
불행히도, @ChristianElsner, 나는 똑같은 생각을 가지고 있었고 이것은 효과가없는 것 같습니다. 이러한 종류의 구조체는 컴파일되지만 멤버는 C#에서 액세스 할 수 없습니다. 'struct '를'value class'로 바꾸면 관리되는 구조체가됩니다.하지만 비트 필드와 유니온 모두에 대해 컴파일러 오류가 발생합니다. – karaken12