在asp.NET c#项目中使用c ++ dll?

时间:2013-12-06 12:10:24

标签: c# c++ asp.net dll header-files

我在我的.NET项目中使用了一个dll。 我尝试用c#来管理它, 并且函数使用_H_cardData_MG结构并返回_H_cardData_MG值。

    c++
int __Read_And_Get_Card_Data ( DWORD deviceSerialNo, DWORD password, DWORD ip, WORD port, 
                                   _H_cardData_MG *cardData )
    C#   
      public static  extern int __Read_And_Get_Card_Data(System.UInt32 deviceSerialNo, System.UInt32 password, System.UInt32 ip, System.UInt16 port, ref _H_cardData_MG kartdata);

我试图将头文件更改为c#class,如上所示, 但我想我不能修复它们的尺寸?

错误是'指定的数组不是预期的类型。' 你有什么问题吗? 我可以只通过字节数组取值吗? 我的意思是;

 byte[] bytarr = new byte[256] 
public static  extern int __Read_And_Get_Card_Data(System.UInt32 deviceSerialNo, System.UInt32 password, System.UInt32 ip, System.UInt16 port, ref byte[] bytarr);

但是我收到了错误:'类型异常' System.ExecutionEngineException'被扔了。'

c ++头文件代码;

struct _H_cardData_MG 
{ 
int cardCode; 
int credit; 
int minCredit; 

WORD reserved01; 
WORD endUserCode; 
WORD password; 

BYTE groupCode; 

BYTE cardType:2; 
BYTE disabled:1; 
BYTE outOfCtrlDirection:1; 
BYTE bonusUsage:2; 
BYTE :2; 

char name[16]; 

struct _H_lastAccess_MF appData[4]; 

BYTE creditMultipler; 
BYTE bonusRatio; 

BYTE reserved02; 
BYTE reserved03; 

int bonus; 
BYTE reserved04[4]; 
}; 

struct _H_lastAccess_MF // size=12 
{ WORD lastUsedHourMin:11; 
WORD in:1; 
WORD :4; 

SHORT lastUsedDate; 

WORD wStart:11; 
WORD limitCnt:3; 
WORD :2; 

WORD wEnd:11; 
WORD limitMax:3; 
WORD :2; 

WORD expireDate; 

WORD expireHourMin:11; 
WORD prePaymentCredit:5; 
}; 

C#CODES * ** * ** * ** * ** * ** * ** * **

public class _H_cardData_MG 
{ 
public int cardCode { get; set; } 
public int credit { get; set; } 
public int minCredit { get; set; } 

public UInt16 reserved01 { get; set; } 
public UInt16 endUserCode { get; set; } 
public UInt16 password { get; set; } 

public byte groupCode { get; set; } 

public byte cardType { get; set; } 
public byte disabled { get; set; } 
public byte outOfCtrlDirection { get; set; } 
public byte bonusUsage { get; set; } 
public byte bos { get; set; } 

public char[] name = new char[16] ; 

public _H_lastAccess_MF [] appData = new _H_lastAccess_MF [4]; 

public byte creditMultipler{ get; set; } 
public byte bonusRatio{ get; set; } 

public byte reserved02{ get; set; } 
public byte reserved03{ get; set; } 

public int bonus{ get; set; } 
public byte[] reserved04 = new byte[4]; 

}; 

public struct _H_lastAccess_MF // size=12 
{ 
public UInt16 lastUsedHourMin { get; set; } 
public UInt16 zin { get; set; } 
public UInt16 bos1 { get; set; } 

public short lastUsedDate { get; set; } 

public UInt16 wStart{ get; set; } 
public UInt16 limitCnt{ get; set; } 
public UInt16 bos2{ get; set; } 

public UInt16 wEnd{ get; set; } 
public UInt16 limitMax{ get; set; } 
public UInt16 bos3 { get; set; } 

public UInt16 expireDate { get; set; } 

public UInt16 expireHourMin{ get; set; } 
public UInt16 prePaymentCredit{ get; set; } 
}; 

我做错了什么或有什么办法?

1 个答案:

答案 0 :(得分:0)

这应该适用于C#结构来保存您想要的数据:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
public struct _H_cardData_MG {

    /// int
    public int cardCode;

    /// int
    public int credit;

    /// int
    public int minCredit;

    /// WORD->unsigned short
    public ushort reserved01;

    /// WORD->unsigned short
    public ushort endUserCode;

    /// WORD->unsigned short
    public ushort password;

    /// BYTE->unsigned char
    public byte groupCode;

    /// cardType : 2
    ///disabled : 1
    ///outOfCtrlDirection : 1
    ///bonusUsage : 2
    ///AnonymousMember1 : 2
    public uint bitvector1;

    /// char[16]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=16)]
    public string name;

    /// _H_lastAccess_MF[4]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=4, ArraySubType=System.Runtime.InteropServices.UnmanagedType.Struct)]
    public _H_lastAccess_MF[] appData;

    /// BYTE->unsigned char
    public byte creditMultipler;

    /// BYTE->unsigned char
    public byte bonusRatio;

    /// BYTE->unsigned char
    public byte reserved02;

    /// BYTE->unsigned char
    public byte reserved03;

    /// int
    public int bonus;

    /// BYTE[4]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=4, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
    public byte[] reserved04;

    public uint cardType {
        get {
            return ((uint)((this.bitvector1 & 3u)));
        }
        set {
            this.bitvector1 = ((uint)((value | this.bitvector1)));
        }
    }

    public uint disabled {
        get {
            return ((uint)(((this.bitvector1 & 4u) 
                        / 4)));
        }
        set {
            this.bitvector1 = ((uint)(((value * 4) 
                        | this.bitvector1)));
        }
    }

    public uint outOfCtrlDirection {
        get {
            return ((uint)(((this.bitvector1 & 8u) 
                        / 8)));
        }
        set {
            this.bitvector1 = ((uint)(((value * 8) 
                        | this.bitvector1)));
        }
    }

    public uint bonusUsage {
        get {
            return ((uint)(((this.bitvector1 & 48u) 
                        / 16)));
        }
        set {
            this.bitvector1 = ((uint)(((value * 16) 
                        | this.bitvector1)));
        }
    }

    public uint AnonymousMember1 {
        get {
            return ((uint)(((this.bitvector1 & 192u) 
                        / 64)));
        }
        set {
            this.bitvector1 = ((uint)(((value * 64) 
                        | this.bitvector1)));
        }
    }
}

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct _H_lastAccess_MF {

    /// lastUsedHourMin : 11
    ///in : 1
    ///AnonymousMember1 : 4
    public uint bitvector1;

    /// SHORT->short
    public short lastUsedDate;

    /// wStart : 11
    ///limitCnt : 3
    ///AnonymousMember2 : 2
    ///wEnd : 11
    ///limitMax : 3
    ///AnonymousMember3 : 2
    public uint bitvector2;

    /// WORD->unsigned short
    public ushort expireDate;

    /// expireHourMin : 11
    ///prePaymentCredit : 5
    public uint bitvector3;

    public uint lastUsedHourMin {
        get {
            return ((uint)((this.bitvector1 & 2047u)));
        }
        set {
            this.bitvector1 = ((uint)((value | this.bitvector1)));
        }
    }

    public uint @in {
        get {
            return ((uint)(((this.bitvector1 & 2048u) 
                        / 2048)));
        }
        set {
            this.bitvector1 = ((uint)(((value * 2048) 
                        | this.bitvector1)));
        }
    }

    public uint AnonymousMember1 {
        get {
            return ((uint)(((this.bitvector1 & 61440u) 
                        / 4096)));
        }
        set {
            this.bitvector1 = ((uint)(((value * 4096) 
                        | this.bitvector1)));
        }
    }

    public uint wStart {
        get {
            return ((uint)((this.bitvector2 & 2047u)));
        }
        set {
            this.bitvector2 = ((uint)((value | this.bitvector2)));
        }
    }

    public uint limitCnt {
        get {
            return ((uint)(((this.bitvector2 & 14336u) 
                        / 2048)));
        }
        set {
            this.bitvector2 = ((uint)(((value * 2048) 
                        | this.bitvector2)));
        }
    }

    public uint AnonymousMember2 {
        get {
            return ((uint)(((this.bitvector2 & 49152u) 
                        / 16384)));
        }
        set {
            this.bitvector2 = ((uint)(((value * 16384) 
                        | this.bitvector2)));
        }
    }

    public uint wEnd {
        get {
            return ((uint)(((this.bitvector2 & 134152192u) 
                        / 65536)));
        }
        set {
            this.bitvector2 = ((uint)(((value * 65536) 
                        | this.bitvector2)));
        }
    }

    public uint limitMax {
        get {
            return ((uint)(((this.bitvector2 & 939524096u) 
                        / 134217728)));
        }
        set {
            this.bitvector2 = ((uint)(((value * 134217728) 
                        | this.bitvector2)));
        }
    }

    public uint AnonymousMember3 {
        get {
            return ((uint)(((this.bitvector2 & 3221225472u) 
                        / 1073741824)));
        }
        set {
            this.bitvector2 = ((uint)(((value * 1073741824) 
                        | this.bitvector2)));
        }
    }

    public uint expireHourMin {
        get {
            return ((uint)((this.bitvector3 & 2047u)));
        }
        set {
            this.bitvector3 = ((uint)((value | this.bitvector3)));
        }
    }

    public uint prePaymentCredit {
        get {
            return ((uint)(((this.bitvector3 & 63488u) 
                        / 2048)));
        }
        set {
            this.bitvector3 = ((uint)(((value * 2048) 
                        | this.bitvector3)));
        }
    }
}

希望这是你想要的:)

方法P / Invoke签名应如下所示:

[System.Runtime.InteropServices.DllImportAttribute("Your.dll", EntryPoint="__Read_And_Get_Card_Data")]
public static extern  int __Read_And_Get_Card_Data(uint deviceSerialNo, uint password, uint ip, ushort port, ref _H_cardData_MG cardData) ;