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);
}
}
答案 0 :(得分:1)
您已将__int64
正确转换为C#long
。
然后你想要并将long BaudRate
和long Timeout
变成C#long
,但这是错误的,这些是32位变量。
最好忘记类型long
曾经存在(就互操作而言)因为它总是会增加混乱。只需根据需要使用System.Int64
和System.Int32
。
你的字符串也是错误的,它们是C ++中的内联字符数组,这意味着你需要在C#或a fixed
array中使用属性。