c# - 需要帮助将 C++ 定义转换为等效的 C#

标签 c# c++

我正在使用 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/

相关文章:

c++ - 促进 ASIO 异常传播

c++ - CUDA 在运行时检查 nvcc "-arch"-flag

c++ - VC++ 运行时错误 : Debug Assertation Failed

c++ - 更改 Makefile 标志时如何强制重新编译?

c# - 如何只修改 LINQ 投影中的一个或两个字段?

c# - 如何在 C# 中将一个字符串与大量预定义字符串进行比较?

c# - 如果后面跟着任何字母,如何使用正则表达式删除单独的 1?

c++ - 在函数调用之前使用 (void)

c# - VSPackage:没有打开 "real"解决方案时如何获取所选文件

c# - 当您只了解其结构的一部分时如何读取 xml 并将其写回