从非托管 C# DLL 返回列表/数组

Return List/Array from unmanaged C# DLL

本文关键字:返回 列表 数组 DLL      更新时间:2023-10-16

我有非托管的C# DLL:

[DllExport(ExportName = "GetStudentsList", CallingConvention = CallingConvention.StdCall)]
static public List<StudentsStruct>GetStudentsList() {  return List<StudentsStruct>;   }

[DllExport(ExportName = "maxElement", CallingConvention = CallingConvention.StdCall)]
static public int maxElement(int a, int b) { return c; }

我想从函数中返回List<StudentsStruct>

我想在C++应用程序中运行上面的函数:

using GetStudentsListFn = List<StudentsStruct> (__stdcall *) (void);
GetStudentsListFn  GetStudentsList = reinterpret_cast<GetStudentsListFn> (GetProcAddress(mod, "GetStudentsList"));
List<StudentsStruct> myList = GetStudentsList();
using MaxElementFn = int(__stdcall *) (int a, int b);
MaxElementFn maxElement = reinterpret_cast<MaxElementFn> (GetProcAddress(mod, "maxElement"));
std::printf("max: %dn", maxElement(1, 2));

MaxElement( ( 函数运行良好,因为它返回一个 int。但是我想返回"学生结构"的列表/数组,从C#到C++。

我会使用数组参数out并返回大小,如下所示:

using ExportDllAttribute.DllExport;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct StudentsStruct
{
public string Name;
public int SomeInt;
public double SomeDouble;
[DllExport]
public static int GetStudentsList([Out] out StudentsStruct[] students)
{
students = new StudentsStruct[] { new StudentsStruct { Name = "Satan", SomeInt = 666, SomeDouble = 666 },
new StudentsStruct { Name = "Techno", SomeInt = 777, SomeDouble = 777 } };
return students.Length;
}
}

和C++代码:

#include<Windows.h>
struct StudentsStruct
{
public:
LPWSTR Name;
int SomeInt;
double SomeDouble;
};
using GetStudentsListFn = int (__stdcall*) (StudentsStruct **);
int main()
{
HMODULE hModule = LoadLibraryA("DllExportArrayTest.dll");
if (hModule)
{
GetStudentsListFn GetStudentsList = reinterpret_cast<GetStudentsListFn>(GetProcAddress(hModule, "GetStudentsList"));
StudentsStruct* students = NULL;
auto size = GetStudentsList(&students);
for (int i = 0; i < size; i++)
auto student = students[i];
FreeLibrary(hModule);
}
}