将C++代码转换为C#
在转换下面的代码C#时,我遇到了非常棘手的挑战,任何人都可以帮助我解决这个问题。将C++代码转换为C#
typedef struct ACSNameAddr_t {
char FAR *serverName; // How do i use FAR in C#
struct {
short length;
unsigned char FAR *value;
} serverAddr;
} ACSNameAddr_t;
以及如何使用这个工会在C#
typedef struct
{
union
{
CSTARouteRegisterAbortEvent_t registerAbort;
CSTARouteUsedEvent_t routeUsed;
CSTARouteUsedExtEvent_t routeUsedExt;
CSTARouteEndEvent_t routeEnd;
CSTAPrivateEvent_t privateEvent;
CSTASysStatEvent_t sysStat;
CSTASysStatEndedEvent_t sysStatEnded;
}u;
} CSTAEventReport;
编辑答案:
所以包括所有的答案,这里由我写信转换后的代码。通过使用StructLayout如有什么不妥编辑它,它可能是有用的人..
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct ACSNameAddr_t
{
string serverName;
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct serverAddr
{
public short length;
string value;
};
};
和第二个,
[StructLayout(LayoutKind.Explicit, Pack = 4)]
public struct CSTAEventReport{
[StructLayout(LayoutKind.Explicit, Pack = 4)]
public struct u{
[FieldOffset(0)]
public CSTARouteRegisterAbortEvent_t registerAbort;
[FieldOffset(0)]
public CSTARouteUsedEvent_t routeUsed;
[FieldOffset(0)]
public CSTARouteUsedExtEvent_t routeUsedExt;
[FieldOffset(0)]
public CSTARouteEndEvent_t routeEnd;
[FieldOffset(0)]
public CSTAPrivateEvent_t privateEvent;
[FieldOffset(0)]
public CSTASysStatEvent_t sysStat;
[FieldOffset(0)]
public CSTASysStatEndedEvent_t sysStatEnded;
};
};
所以包括你所有的答案,在这里我正在写转换的代码。如果有什么问题,请编辑它,它可能是有用的人..
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct ACSNameAddr_t
{
string serverName;
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct serverAddr
{
public short length;
string value;
};
};
和第二个,
[StructLayout(LayoutKind.Explicit, Pack = 4)]
public struct CSTAEventReport{
[StructLayout(LayoutKind.Explicit, Pack = 4)]
public struct u{
[FieldOffset(0)]
public CSTARouteRegisterAbortEvent_t registerAbort;
[FieldOffset(0)]
public CSTARouteUsedEvent_t routeUsed;
[FieldOffset(0)]
public CSTARouteUsedExtEvent_t routeUsedExt;
[FieldOffset(0)]
public CSTARouteEndEvent_t routeEnd;
[FieldOffset(0)]
public CSTAPrivateEvent_t privateEvent;
[FieldOffset(0)]
public CSTASysStatEvent_t sysStat;
[FieldOffset(0)]
public CSTASysStatEndedEvent_t sysStatEnded;
};
};
您可以模拟C++在C#中的工会:
http://msdn.microsoft.com/en-us/library/acxa5b99(v=vs.80).aspx
基本上,只需声明一系列具有相同偏移量的变量,这实际上就是一个联合。
编辑:刚才拷贝/从链接粘贴来说明:
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[System.Runtime.InteropServices.FieldOffset(0)]
public int i;
[System.Runtime.InteropServices.FieldOffset(0)]
public double d;
[System.Runtime.InteropServices.FieldOffset(0)]
public char c;
[System.Runtime.InteropServices.FieldOffset(0)]
public byte b;
}
char FAR *
仅仅是一个指向字符串的指针。回到过去,我们不得不担心不同的内存型号,FAR
是一个32位指针,而NEAR
是一个16位指针。像处理任何其他字符指针那样对待char FAR *
。
“任何其他字符串指针”是“任何其他字符指针”?对不起,作为一个僧侣(实际上,我们都知道我并不是真的对不起,我只是对待成为一个有礼貌的人)。 – 2011-06-01 16:51:28
对于char FAR *,C#中的等效代码是什么? 对不起,我不知道很多转换部分 – 2011-06-01 17:01:39
@ Chandu- Indyaah:对于C#,使用'string'来代替C/C++'char FAR *'。 – 2011-06-01 17:07:12
http://code2code.net/ – 2011-06-01 16:45:21
@Soner格尼尔:史诗这两个代码片段均失败。 – 2011-06-01 16:48:05
@Soner - 试过已经,没有工作..如果有人能够将此转换,那么我将能够转换其他方法。 :) – 2011-06-01 16:48:16