如何从C#将对象设置为C++

本文关键字:设置 C++ 对象 | 更新日期: 2023-09-27 18:27:18

我想从C#配置一个C++项目。

E.g:如果我在C#中有这门课:

public class Person
{
    public Person(){}
    public string FirstName
    {get; set;}
    public string LastName
    {get; set;}
    public int Age
    {get; set;}
}

然后我有一份人员名单:

Person per1 = new Person();
per1.FirstName = "Per1";
per1.LastName = "Last";
per1.Age = 20;

Person per2 = new Person();
per2.FirstName = "Per2";
per2.LastName = "Last2";
per2.Age = 21;

然后我有:

List<Person> persons = new List();
persons.Add(per1);
persons.Add(per2);

我的问题是如何通过

人员

'列表。

样品不胜感激!

提前谢谢。

如何从C#将对象设置为C++

不能将List<>传递给非托管C++,因为它无法访问CLR,也不知道该如何处理它。

您可以做的是在C++中定义一个与C#类布局匹配的结构,并将其传递给需要数组的导出C++函数。根据你对C#和C++定义的控制程度,你可以做一些事情来让自己的生活更轻松:

首先,考虑interop定义您的C#类型:

// In C#:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct Person
{
  [MarshalAs(UnmanagedType.LPWStr)] public string FirstName;
  [MarshalAs(UnmanagedType.LPWStr)] public string LastName;
  public int Age;
}
// In C++
typedef struct tagPerson
{
  LPWSTR firstname;
  LPWSTR lastname;
  LONG age;
} Person;

第二,由于C/C++数组是不受管理的,您将需要一些其他方式来定义它的大小;最简单的选择是向C++函数传递第二个参数,即长度。

// In C++
extern "C" __declspec( dllexport ) void MyFunction(LONG count, Person[] people);
// In C#
[DllImport("mydll.dll")]
public static extern void MyFunction(
  int count,
  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] Person[] people);

然后您可以简单地在C#中调用此方法;如果你已经有了填充的List<Person>,你会这样做:

var personsArray = persons.ToArray();
NativeMethods.MyFunction(personsArray.Length, personsArray);