簡體   English   中英

如何處理C#中C DLL文件中的復雜結構返回類型?

[英]How do I handle a complex struct return type from a C DLL file within C#?

我一直在嘗試讓C庫(DLL)與C#中的一些簡單測試代碼一起使用。 到目前為止,我已經能夠導入和使用簡單的功能了。 我現在遇到的問題是,我不知道如何從導入的函數中接收復雜的結構返回類型。

這是兩個函數簽名:

C:

#define HID_API_EXPORT __declspec(dllexport)
#define HID_API_CALL

struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);

C#:

[DllImport("hidapi.dll")]
public static extern hid_device_info hid_enumerate(ushort vendor_id, ushort product_id);

這是兩個結構:

C:

struct hid_device_info {
    char *path;
    unsigned short vendor_id;
    unsigned short product_id;
    wchar_t *serial_number;
    unsigned short release_number;
    wchar_t *manufacturer_string;
    wchar_t *product_string;
    unsigned short usage_page;
    unsigned short usage;
    int interface_number;

    struct hid_device_info *next;
};

C#:

[StructLayout(LayoutKind.Sequential)]
public struct hid_device_info
{
    public IntPtr path;
    public ushort vendorid;
    public ushort productid;
    public IntPtr serialnumber;
    public ushort releasenumber;
    public IntPtr manufacturer;
    public IntPtr product;
    public ushort usagepage;
    public ushort usage;
    public int interfacenumber;

    public IntPtr next;
}

我目前在運行程序時遇到此錯誤:

托管調試助手“ PInvokeStackImbalance”已在“ C:\\ Users \\ tajensen \\ Documents \\ hidapiCS \\ hidapitest \\ bin \\ Debug \\ hidapitest.vshost.exe”中檢測到問題。

附加信息:對PInvoke函數'hidapiCS!hidapiCS.hidapi :: hid_enumerate'的調用已使堆棧不平衡。 這可能是因為托管PInvoke簽名與非托管目標簽名不匹配。 檢查PInvoke簽名的調用約定和參數是否與目標非托管簽名匹配。

我做了一些挖掘,發現的唯一內容描述了如何接收非常簡單的結構的返回類型(即,沒有指針,只有基本類型,如ints和bools)。 我確實很高興對這個問題有一些其他的見解,因為我知道我想去哪里,但是我對這種代碼的了解還不夠,無法自己深入研究。

預先感謝,湯姆斯

您的結構看起來不錯,禁止任何更改其包裝的命令行標志。

可能是因為這條線

#define HID_API_CALL

這意味着您正在使用默認的調用約定,通常為__cdecl 因此,將P / Invoke定義更改為:

[DllImport("hidapi.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern hid_device_info hid_enumerate(ushort vendor_id, ushort product_id);

因此,正確遵循了如何在C側管理堆棧的規則。

有一個名為SWIG的工具,它是一種代碼生成工具,可以將用C和C ++編寫的程序與各種高級編程語言(如c#)連接起來。 它為二十三種不同的目標語言生成包裝器代碼:

對於這些任務,特別是數據類型/指針轉換以及許多其他任務,它非常強大。 它節省了手動轉換。

嘗試使用此工具為您的案例生成C#代碼,最后編譯Dll。

從以下網址下載二進制文件: http : //prdownloads.sourceforge.net/swig/swigwin-3.0.10.zip

對於教程: http : //www.swig.org/tutorial.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM