我正在使用 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 函数时,它引发了一个错误(内存错误),我猜是因为那个长变量。所以我的问题是如何将“const LONG* condition”翻译成 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 语言编写包装器。
关于c# - 需要帮助将 C++ 定义转换为等效的 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3611882/