C++ cli cli/C++;如何使用非托管类型元素定义cli::array?

C++ cli cli/C++;如何使用非托管类型元素定义cli::array?,c++-cli,C++ Cli,我有一个原生的C/C++结构 typedef struct { ... } AStruct; 在C++/CLI代码中,我定义了一个委托和一个CLI数组,如下所示 public delegate void UpdateDataDelegate(AStruct% aSt,AStruct% bSt); cli::Array<AStruct>^ args=gcnew cli::Array<AStruct>(2); // complile failed!!!!。 this-&

我有一个原生的C/C++结构

typedef struct
{
...
} AStruct;
在C++/CLI代码中,我定义了一个委托和一个CLI数组,如下所示

public delegate void UpdateDataDelegate(AStruct% aSt,AStruct% bSt);

cli::Array<AStruct>^ args=gcnew cli::Array<AStruct>(2); // complile failed!!!!。

this->Invoke(updateData,args);
public委托void UpdateDataDelegate(AStruct%aSt,AStruct%bSt);
cli::Array^args=gcnew cli::Array(2);//康普利失败了
这->调用(updateData,args);
AStruct
有许多字段,并且被许多模块使用,因此如果我不想为
AStruct
编写管理包装,如何使上述代码工作


非常感谢

托管阵列的元素类型必须是托管类型。解决方法之一是存储指针:

array<AStruct*>^ args=gcnew array<AStruct*>(2);
args[0] = new AStruct;
// etc...

UpdateDataDelegate^ dlg = gcnew UpdateDataDelegate(Mumble);
dlg->Invoke(*args[0], *args[1]);
array^args=gcnewarray(2);
args[0]=新结构;
//等等。。。
UpdateDataDelegate ^dlg=gcnew UpdateDataDelegate(Mumble);
dlg->Invoke(*args[0],*args[1]);

什么是更新数据?为什么UpdateDataElegate接受两个AStruct参数,而您尝试创建AStruct数组?使用本机容器(例如
std::vector
)存储本机数据有什么问题?更好:它必须是托管类型或基元类型。这就是指针被允许的原因。根据“托管类型”的什么定义,指针是托管类型?它不由垃圾收集器管理,并且在非托管程序中可用。Ecma-335。其他重要提示是,您可以在C#中使用它们,C#是一种不支持生成非托管代码的语言,并且可以将它们存储在数组中。相反,这可能意味着C#同时支持托管类型和基元类型(事实上它支持)。ECMA-335中的短语“托管类型”出现两次,而且这两次提到的行为都不适用于指针(根据ECMA-335托管类型,指针具有固定布局)。