gpt4 book ai didi

c++ - 如何将结构的 C++/CLI 数组编码为非托管 C++

转载 作者:行者123 更新时间:2023-11-30 02:13:12 25 4
gpt4 key购买 nike

我正在寻找将结构数组传递给非托管 C++ dll 的正确语法。

我的 dll 导入是这样调用的

    #define _DllImport [DllImport("Controller.dll", CallingConvention = CallingConvention::Cdecl)] static
_DllImport bool _Validation(/* array of struct somehow */);

在我的客户端代码中有

List<MyStruct^> list;
MyObject::_Validation(/* list*/);

我知道 System::Runtime::InteropServices::Marshal 有很多有用的方法来做这样的事情,但我不确定该使用哪个。

最佳答案

使用 StructLayout.Sequential 创建非托管结构的托管版本(确保按相同顺序放置)。然后,您应该能够像将其传递给任何托管函数一样传递它(例如,Validation(MyStruct[] pStructs)。

例如,假设我们的原生函数具有以下原型(prototype):

extern "C" {

STRUCTINTEROPTEST_API int fnStructInteropTest(MYSTRUCT *pStructs, int nItems);

}

而原生的MYSTRUCT定义如下:

struct MYSTRUCT
{
int a;
int b;
char c;
};

然后在 C# 中,您定义结构的托管版本如下:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct MYSTRUCT
{
public int a;
public int b;
public byte c;
}

托管原型(prototype)如下:

    [System.Runtime.InteropServices.DllImportAttribute("StructInteropTest.dll", EntryPoint = "fnStructInteropTest")]
public static extern int fnStructInteropTest(MYSTRUCT[] pStructs, int nItems);

然后您可以调用该函数并向其传递一个 MYSTRUCT 结构数组,如下所示:

    static void Main(string[] args)
{
MYSTRUCT[] structs = new MYSTRUCT[5];

for (int i = 0; i < structs.Length; i++)
{
structs[i].a = i;
structs[i].b = i + structs.Length;
structs[i].c = (byte)(60 + i);
}

NativeMethods.fnStructInteropTest(structs, structs.Length);

Console.ReadLine();
}

关于c++ - 如何将结构的 C++/CLI 数组编码为非托管 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com