[英]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.