2011-06-01 179 views
-1

在转换下面的代码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; 
     }; 
}; 
+2

http://code2code.net/ – 2011-06-01 16:45:21

+3

@Soner格尼尔:史诗这两个代码片段均失败。 – 2011-06-01 16:48:05

+0

@Soner - 试过已经,没有工作..如果有人能够将此转换,那么我将能够转换其他方法。 :) – 2011-06-01 16:48:16

回答

0

所以包括你所有的答案,在这里我正在写转换的代码。如果有什么问题,请编辑它,它可能是有用的人..

[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; 
     }; 
}; 
3

您可以模拟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; 
} 
4

char FAR *仅仅是一个指向字符串的指针。回到过去,我们不得不担心不同的内存型号,FAR是一个32位指针,而NEAR是一个16位指针。像处理任何其他字符指针那样对待char FAR *

+1

“任何其他字符串指针”是“任何其他字符指针”?对不起,作为一个僧侣(实际上,我们都知道我并不是真的对不起,我只是对待成为一个有礼貌的人)。 – 2011-06-01 16:51:28

+0

对于char FAR *,C#中的等效代码是什么? 对不起,我不知道很多转换部分 – 2011-06-01 17:01:39

+1

@ Chandu- Indyaah:对于C#,使用'string'来代替C/C++'char FAR *'。 – 2011-06-01 17:07:12