簡體   English   中英

需要幫助將c ++定義轉換為c#等效

[英]need help converting c++ definitions to c# equivalent

我正在使用API​​(用C ++編寫)連接到DVR機器,實際上我只有.dll和.lib文件,並且我想在.NET(C#)中完成這項工作。 因此,API文檔包含dll中所有函數的定義,而我很難理解如何將這些函數轉換為等效的C#定義。 其中有些簡單明了,但有些我無法使其奏效。

例如,有以下功能:

bool searchEvent(int channel, const LONG* condition, bool next)  

在我的C#類中,我輸入了以下內容:

[DllImport("search.dll")]  
protected static extern bool searchEvent(int channel,  
[MarshalAs(UnmanagedType.I8)]long condition, bool next);

但是,當我調用searchEvent函數時,它會引發一個錯誤(內存錯誤),原因是var太長。 所以我的問題是如何將“ const LONG *條件”轉換為c#? 另外,該searchEvent函數會觸發一個返回結構的回調。 我無法翻譯該結構的某些變量,例如:

char _version[2]  
time_t _time  
BYTE* _minute  
unsigned short int _dwell[MAX]  

有人可以幫我嗎? 我不是c ++專家,因此非常感謝所有技巧。 謝謝!

    [DllImport("search.dll")]
    [return: MarshalAs(UnmanagedType.U1)]
    private static extern bool searchEvent(
        int channel,
        ref int condition,
        [MarshalAs(UnmanagedType.U1)] bool next
    );

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    private struct Mumble {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
        public string version;
        public long time;
        public IntPtr minute;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX)]
        public ushort _dwell[];
    }

您必須使用Marshal.ReadXxxx()來封送Mumble.Minute值。 這些聲明不適用於互操作,建議使用C ++ / CLI語言編寫包裝器。

在不進行具體說明的情況下,您需要克服兩個障礙:1)由於您沒有原始的.h(頭文件)文件,因此您會根據API文檔猜測其可能是什么。 希望你會做對的,但是頭文件中可能會包含一些細微的東西,例如文檔結構打包,調用約定,名稱修飾等,這些都不會包含在文檔中。東西。 最重要的是,您必須進行實驗。

2)當您沒有原始的頭文件時,您試圖在C DLL中創建P / Invoke調用。 您甚至都不知道是否知道如何從C進行這些調用,更不用說C#了。

通過直接從C#執行此操作,您試圖同時解決這兩個問題。 當某些事情不起作用時,您不確定這是因為P / Invoke語法錯誤,還是與您對頭文件內容的解釋有關的問題。 我會嘗試一次解決這些問題。 首先,嘗試從一個簡單的C控制台應用程序進行DLL調用。 創建起來並不難,然后手動構建一個.H文件,這樣您就可以進行所有調用。

完成此操作后,現在必須從C#中進行調用。

坦白說,除非我只能重復使用其他人(從http://PInvoke.net )為Windows API創建的P / Invoke,否則避免使用P / Invoke。 如果您是我,並且我已經掌握了如何使用C進行調用的新方法,則只需為其創建一個C ++ / CLI包裝DLL。 好處是,您可以完全像在控制台應用程序中那樣進行呼叫-無需P / Invoke。 然后將來自C ++ / CLI DLL的那些調用公開為.NET。 您的C#代碼將調用C ++ / CLI DLL,該DLL看起來像(並且是).NET組件,並且C#代碼中沒有奇怪的P / Invoke內容。

祝好運。

暫無
暫無

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

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