vc中的结构为
typedef struct _Addr
{
   BYTE Length;
   BYTE Type;
   BYTE Self[32];
}Addr;

typedef struct _Info 
{
   enum    EReceiveState State;
   BYTE    Self[512];
   BYTE    Time[20];
   Addr    SmscAddr;
   Addr    OriginalAddr;
}Info;我在C#中声明该结构的原型为
[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
public class Info
{
public int recsta;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=512 )]
public String self;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=20 )]
public String smscTime;
public byte cAddlength;
public byte cAddtype;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=32 )]
public String cAddself;
public byte oAddlength ;
public byte oAddtype;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=32 )]
public String oAddself;
}现需要将C#中该原型的一个实例做为参数传入vc中,由vc中的函数对其做出修改。但我所声明的这个原型似乎不对,没法得到正确的结果。请各位指教一下,不胜感激!

解决方案 »

  1.   

    参考
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconstructssample.htm
      

  2.   

    BYTE Self[512];
    ---》
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )]
    public byte[] Self;
      

  3.   

    SizeConst=3 ??
    笔误还是另有原因?
      

  4.   

    [ StructLayout( LayoutKind.Sequential)]
    public struct Addr
    {
    public byte Length;
    public byte Type;
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=32 )]
    public byte[] Self;
    }[ StructLayout( LayoutKind.Sequential)]
    pubic struct Info
    {
    public int state;
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=512 )]
    public byte[] Self;
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=20 )]
    public byte[] Time;
    public Addr SmscAddr;
    public Addr OriginalAddr;
    }
      

  5.   

    C#中的函数原型我是这样写的[DllImport("SmsDLL.dll", EntryPoint="Receive_conv",CharSet=CharSet.Ansi)]
    public static extern int Receive([In, Out]Info sinfo, int nIndex);在这里我用了[In,Out]属性,不知在vc的函数中参数是否要用引用类型?
      

  6.   

    说来有点复杂。以前没接触过vc和c#,最近因为项目需要,只得硬着头皮上。手头有个vc写的dll,所有功能都是用类的方法实现的,该方法的原型为
    int  CSms::Receive(SMsgInfo &sInfo, int nIndex)现在的项目是用c#开发的,要调用该dll中的函数。我不知道怎样从dll中导出类的方法,只好现在dll中写个函数,包装该方法,再将此函数导出。我写的函数为
    extern "C" int Receive_conv(SCSms::MsgInfo sMess, int nIndex)
    不知道该函数的第一个参数要不要用引用,都试过,不行。
      

  7.   

    调试一下看看送过去的结构是否正确用这个试试
    SCSms::MsgInfo * sMess
      

  8.   

    1、怎样调试?当代码运行到dll部分时好像看不到调试状态啊2、你是说在我写的包装函数中将第一个参数变成指针类型?3、我试过了,第一个参数还是要用引用,否则无法将改变传回调用方。另外,问题肯定出在byte数组那不分,去掉那部分就没问题了。
      

  9.   

    我还用stringbuilder试过,把所有要返回的参数都以stringbuilder类型传递过去,但返回的都是乱码。
      

  10.   

    vc中调试dll
      在project-》Settings-》debug下设置调用该dll的exe文件指针也可以将改变传回调用方去掉哪个byte数组就可以了?
      

  11.   

    1、“CharSet=CharSet.Ansi把这个去掉”
       这个试过了,不管用2、把结构中的所有byte数组全去掉,只留byte数据就没问题