【问题标题】:DllImport on c#C# 上的 DllImport
【发布时间】:2011-05-25 21:00:07
【问题描述】:

如何在 C# 中访问 C++ DLL 的函数

以下是 DLL 的原型:

NOMANGLE int CCONV SSPSendCommand (SSP_COMMAND * cmd, SSP_COMMAND_INFO * sspInfo);
NOMANGLE int CCONV OpenSSPComPort (SSP_COMMAND * cmd);
NOMANGLE int CCONV OpenSSPComPort2 (SSP_COMMAND * cmd);
NOMANGLE int CCONV OpenSSPComPortUSB (SSP_COMMAND * cmd);
NOMANGLE int CCONV CloseSSPComPort (void);
NOMANGLE int CCONV CloseSSPComPort2 (void);
NOMANGLE int CCONV CloseSSPComPortUSB (void);
NOMANGLE int CCONV DownloadFileToTarget (char * szFilename, int cPort, unsigned char sspAddress);
NOMANGLE long CCONV GetRamDownloadStatus (RAM_UPDATE_STATUS * rmData);
NOMANGLE int CCONV SetPortCloseOption (unsigned int md);
NOMANGLE int CCONV OpenCCTComPort (int PortNumber);
NOMANGLE int CCONV CloseCCTComPort (void);
NOMANGLE int CCONV CCTSendPacket (unsigned char * pkt, unsigned char * length);

在 C# 中我正在尝试这个:

[DllImport ("ITLSSPProc.dll")]
private extern static IntPtr SSP_COMMAND ();

[DllImport ("ITLSSPProc.dll")]
private static extern int OpenSSPComPort (SSP_COMMAND smd);

但它给了我一个错误。我究竟做错了什么?提前致谢

【问题讨论】:

  • NOMANGLE 宏是 extern "C" ?
  • 至少有一个错误是SSP_COMMAND 不是函数。它是一种类型。 [DllImport] 只导入函数。
  • SSP_COMMAND 是一个结构,而不是一个函数。您必须声明该结构,然后将参数声明为“ref SSP_COMMAND”。

标签: c# dllimport


【解决方案1】:

至少有一个错误是SSP_COMMAND 不是函数。它是一种类型。 [DllImport] 只导入函数。要么将其视为不透明的IntPtr,要么创建一个适当的struct 表示。

将其用作不透明的IntPtr

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

有关使用结构,请参阅 MSDN 中的 Passing Structures 并在 C# 中定义 struct SSP_COMMAND。 (此链接包含入门所需的所有内容,包括相关示例)。

编码愉快。

【讨论】:

  • 谢谢,但不告诉我如何调用带参数的函数?
  • [DllImport("ITLSSPProc.dll")] private static extern int OpenSSPComPort(IntPtr cmd);私人静态无效主要(字符串[] args){ cmd.BaudRate = 9600; cmd.PortName = "COM1"; cmd.Parity = Parity.None; cmd.StopBits = StopBits.One; Console.WriteLine(OpenSSPComPort(cmd)); }
  • 查看帖子中的链接了解如何使用自定义结构——帖子中的示例展示了如何使用 opaque IntPtr(它指的是一个对象不能直接操作)。
【解决方案2】:

试试吧:

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.Int32 BaudRate; // baud rate of the packet 
    System.Int32 Timeout; // how long in ms to wait for a reply from the slave 
    char PortNumber; // the serial com port number of the host 
    char SSPAddress; // the SSP address of the slave 
    char RetryLevel; // how many retries to the slave for non-response 
    char EncryptionStatus; // is this an encrypted command 0 - No, 1 - Yes 
    char CommandDataLength; // Number of bytes in the command 
    fixed char CommandData[255]; // Array containing the command bytes 
    char ResponseStatus; // Response Status (PORT_STATUS enum) 
    char ResponseDataLength; // how many bytes in the response 
    fixed char ResponseData[255]; // an array of response data 
    char IgnoreError; // flag to suppress error box (0 - display,1- suppress) 

    public SSP_COMMAND(Byte comport)
    {
        BaudRate = 9600;
        Timeout = 500;
        PortNumber = (char)comport;
        RetryLevel = '5';
        IgnoreError = '0';
        EncryptionStatus = '0';
        ResponseStatus = '0';
        ResponseDataLength = '0';
        SSPAddress = '0';
        CommandDataLength = '0';
        key = new SSP_FULL_KEY(0123456701234567, 0123456701234567);

    }
} 


class Program
{
    //NOMANGLE int CCONV OpenSSPComPort (SSP_COMMAND * cmd); 
    [DllImport("ITLSSPProc.dll")]
    private static extern int OpenSSPComPort(ref SSP_COMMAND cmd);

    //NOMANGLE int CCONV CloseSSPComPort (void);
    [DllImport("ITLSSPProc.dll")]
    private static extern int CloseSSPComPort();

    static void Main(string[] args)
    {
        SSP_COMMAND cmd = new SSP_COMMAND(3);
        /* IntPtr.BaudRate = 9600; 
        IntPtr.PortName = "COM0"; 
        IntPtr.Parity = Parity.None; 
        IntPtr.StopBits = StopBits.One; 
        */
        Console.WriteLine("open {0}", OpenSSPComPort(ref cmd));
        Console.WriteLine("close {0}", CloseSSPComPort());
        Console.ReadKey();
    }
}

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2023-03-08
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多