无法调用本机DLL

时间:2011-05-27 22:02:40

标签: c# dll pinvoke

Trying to use the command dll (c + +) project to c #
Structure dll
typedef struct {
SSP_FULL_KEY Key;
unsigned long BaudRate;
unsigned long Timeout;
unsigned char PortNumber;
unsigned char SSPAddress;
unsigned char RetryLevel;
unsigned char EncryptionStatus;
unsigned char CommandDataLength;
unsigned char CommandData [255];
unsigned char ResponseStatus;
unsigned char ResponseDataLength;
unsigned char ResponseData [255];
unsigned char IgnoreError;
} SSP_COMMAND;

typedef struct {
unsigned __int64 FixedKey;
unsigned __int64 EncryptKey;
} SSP_FULL_KEY;

这是我转过的代码

public struct SSP_FULL_KEY
    {
        long FixedKey;
        long EncryptKey;
        public SSP_FULL_KEY (long fix, long encr)
        {
            FixedKey = fix;
            EncryptKey = encr;
        }

    }
    public struct SSP_COMMAND
    {
        / / String PortNumber;
        SSP_FULL_KEY key;
        long BaudRate; / / baud rate of the packet
        long Timeout; / / how long in ms to wait for a reply from the slave
        string PortNumber; / / the serial com port number of the host
        string SSPAddress; / / the SSP address of the slave
        string RetryLevel; / / how many retries to the slave for non-response
        string EncryptionStatus; / / is this an encrypted command 0 - No, 1 - Yes
        string CommandDataLength; / / Number of bytes in the command
        string [] CommandData; / / Array containing the command bytes
        string ResponseStatus; / / Response Status (PORT_STATUS enum)
        string ResponseDataLength; / / how many bytes in the response
        string [] ResponseData; / / an array of response data
        string IgnoreError; / / flag to suppress error box (0 - display, 1 - suppress)

        public SSP_COMMAND (string comport)
        {
            BaudRate = 9600;
            Timeout = 500;
            PortNumber = comport;
            RetryLevel = "5";
            IgnoreError = "0";
            EncryptionStatus = "0";
            CommandData = new string [255];
            ResponseData = new string [255];
            ResponseStatus = "0";
            ResponseDataLength = "0";
            SSPAddress = "0";
            CommandDataLength = "0";
            key = new SSP_FULL_KEY (0123456701234567, 0123456701234567);

        }
    }

    class Program
    {

        / / [DllImport ("ITLSSPProc.dll")]
        / / Private static extern int OpenSSPComPort (IntPtr smd);

        [DllImport ("ITLSSPProc.dll")]

        private static extern int OpenSSPComPort (SSP_COMMAND cmd);

        static void Main (string [] args)
        {
            SSP_COMMAND cmd = new SSP_COMMAND ("6");
            / * IntPtr.BaudRate = 9600;
            IntPtr.PortName = "COM0";
            IntPtr.Parity = Parity.None;
            IntPtr.StopBits = StopBits.One;

            * /
            Console.WriteLine (OpenSSPComPort (cmd));





        }

Comes out an error
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
UPDATE
Remade, still the same error

public unsafe struct SSP_FULL_KEY { System.Int64 FixedKey; System.Int64 EncryptKey; public SSP_FULL_KEY(System.Int64 fix, System.Int64 encr) { FixedKey = fix; EncryptKey = encr; } } public unsafe struct SSP_COMMAND { //string PortNumber; SSP_FULL_KEY key; System.Int64 BaudRate; // baud rate of the packet System.Int64 Timeout; // how long in ms to wait for a reply from the slave string PortNumber; // the serial com port number of the host string SSPAddress; // the SSP address of the slave string RetryLevel; // how many retries to the slave for non-response string EncryptionStatus; // is this an encrypted command 0 - No, 1 - Yes string CommandDataLength; // Number of bytes in the command fixed char CommandData[255]; // Array containing the command bytes string ResponseStatus; // Response Status (PORT_STATUS enum) string ResponseDataLength; // how many bytes in the response fixed char ResponseData[255]; // an array of response data string IgnoreError; // flag to suppress error box (0 - display,1- suppress) public SSP_COMMAND(string comport) { BaudRate = 9600; Timeout = 500; PortNumber = comport; RetryLevel = "5"; IgnoreError = "0"; EncryptionStatus = "0"; ResponseStatus = "0"; ResponseDataLength = "0"; SSPAddress = "0"; CommandDataLength = "0"; key = new SSP_FULL_KEY(0123456701234567, 0123456701234567); } }

1 个答案:

答案 0 :(得分:1)

您已将__int64正确转换为C#long

然后你想要并将long BaudRatelong Timeout变成C#long,但这是错误的,这些是32位变量。

最好忘记类型long曾经存在(就互操作而言)因为它总是会增加混乱。只需根据需要使用System.Int64System.Int32

你的字符串也是错误的,它们是C ++中的内联字符数组,这意味着你需要在C#或a fixed array中使用属性。