C#调用非托管DLL接口后通过参数返回的结构中有一个整型数据int,非托管是long,即32位整数,当这个整数是0~比较小的整数时返回一律是1,当这个整数是0~-N时返回是-255,如果把数值设得很大,返回的好像是正确的,例如112343455。
    有人知道这是什么原因吗?有什么解决方法?谢谢

解决方案 »

  1.   

    LONG 64 位
    用 int
      

  2.   

    TO:hdt(倦怠)
     我是用的int,但还是这样的错误,可能是字节之间的顺序的问题。
    个位高手帮忙看看
      

  3.   

    把你的dll函数 c 申明贴出来
      

  4.   

    原结构定义:
    typedef struct struTagValue{
    _TCHARTagName[C_FULL_TAGNAME_LEN];
    longTimestamp;
    longTagState;
    BYTETagType;
    union {
    floatrval;
    longlval;
    BOOLbval;
    _TCHARsval[C_STRINGVALUE_LEN];
    };
    }TAGVAL, *LPTAGVAL;
    C#中重新封送声明:
    (主意:C#没有union,而且对象类型不能和非对象类型对齐,而union中所有变量偏移量是相同的,都是0,所以封送成两个结构,函数调用时也重载两个函数,参数分别对应不同的结构)
    [[StructLayout(LayoutKind.Sequential)]
    public struct TAGVAL
    {
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=C_FULL_TAGNAME_LEN)]
    public string TagName;
    public System.Int32 Timestamp;
    public System.Int32 TagState;
    public System.Byte TagType;
    [ StructLayout( LayoutKind.Explicit ,Size=C_STRINGVALUE_LEN )]
    public struct strcurrvalue 
    {
    [ FieldOffset( 0 )]
    public float rval;
    [ FieldOffset( 0 )]
    public int lval;
    [ FieldOffset( 0 )]
    public bool bval;
    };
    public strcurrvalue currvalue;
    };[StructLayout(LayoutKind.Sequential)]
    public struct TAGVAL_S
    {
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=C_FULL_TAGNAME_LEN)]
    public string TagName;
    public System.Int32 Timestamp;
    public System.Int32 TagState;
    public System.Byte TagType;
    [ StructLayout( LayoutKind.Sequential )]
    public struct strcurrvalue 
    {
      [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=C_STRINGVALUE_LEN)]
      public string sval;
    };
    public strcurrvalue currvalue;};
    由于string在C#里面是对象类型所以不能和基本类型放在偏移量相同的地方,VALUE_S专门为需要string值时使用
    出问题的值是union里面的lval其他没有错误,timestamp也是长整型,但因为它是表示时间的,数值比较大,转换成标准时间表示后没有错误。
      

  5.   

    原非托管声明:
    extern "C" BOOL PASCAL EXPORT Agda_GetNextTagValue(HRECORDSET hRecordset, TAGVAL * pTagVal, BOOL bRemoved=TRUE);
    托管封送声明:
    [DllImport("AgilorAPI.dll")]
    public static extern bool Agda_GetNextTagValue(System.Int32 hRecordset,ref TAGVAL pTagVal,bool bRemoved);
      

  6.   

    TO:diecode(老死鸡)
       “调用约定”?调用应该没有问题,因为返回的一个结构里面的其他数值是正确的,只有一个对不上。