从非托管堆中检索托管堆中的数据
Retrieving data in Managed Heap from UnManaged Heap
这是我在 Whosebug 中的第一个 post!
我试图理解 C++/CLI,我有一个具有两个属性 getLx
和 setLx
的非托管结构,它分别检索指向 double 的指针并接受指向 double 的指针。
因此,我在 Unmanaged 方法中填充 setLx
中的值,并尝试从 Managed 范围中的 getLx
中检索值。我想将非托管堆上分配的数据转换或获取到托管堆上。
所以基本上在下面的示例代码中,我需要 double^
引用类型 来自本机 double*
本机指针引用类型
/*Unmanaged Struct*/
struct Grid2D
{
double* getLx() const {
return _Lx;
}
void setLx(double* val) {
_Lx = val;
}
private:
double* _Lx;
public:
int _count;
};
#pragma unmanaged
void UnmanagedFillGrid(Grid2D& d)
{
printf_s("\nunmanaged");
double* item = new double[d._count];
int i = 0;
while (i++ < d._count) {
int r = (rand() % 100) + 1;
item[i] = r;
printf_s("array[%d] = %f\n", i, item[i]);
}
d.setLx(item);
}
#pragma managed
int main(array<System::String ^> ^args)
{
Grid2D d;
d._count = 10;
UnmanagedFillGrid(d);
Console::WriteLine("[managed] count = {0}", d._count);
//getLx returns pointer to double, I need to get in double^
//Is this possible ?
double^ managedLx = d.getLx();//How to convert ??
return 0;
}
首先:虽然它是 C++/CLI 中的有效类型,但您不应该使用 double^
。对值类型的托管引用是奇怪的、不必要的,并且在其他 .Net 语言(例如 C#)中根本不存在。
所以,看起来你的 double*
是一个数组。托管数组类型是 array<double>^
,而不是 double^
。这就是您应该在托管方面使用的内容。托管数组也知道自己的长度,因此您不需要单独公开计数。
为了将数据从 double*
移动到 array<double>^
,需要复制它。无法创建 array
对象以使其使用已由其他对象分配的内存,因此复制数据是唯一的可能。您可以使用 Marshal::Copy
方法,或使用 for
循环并自己复制数据。 (它们归结为同一件事。)
这是我在 Whosebug 中的第一个 post!
我试图理解 C++/CLI,我有一个具有两个属性 getLx
和 setLx
的非托管结构,它分别检索指向 double 的指针并接受指向 double 的指针。
因此,我在 Unmanaged 方法中填充 setLx
中的值,并尝试从 Managed 范围中的 getLx
中检索值。我想将非托管堆上分配的数据转换或获取到托管堆上。
所以基本上在下面的示例代码中,我需要 double^
引用类型 来自本机 double*
本机指针引用类型
/*Unmanaged Struct*/
struct Grid2D
{
double* getLx() const {
return _Lx;
}
void setLx(double* val) {
_Lx = val;
}
private:
double* _Lx;
public:
int _count;
};
#pragma unmanaged
void UnmanagedFillGrid(Grid2D& d)
{
printf_s("\nunmanaged");
double* item = new double[d._count];
int i = 0;
while (i++ < d._count) {
int r = (rand() % 100) + 1;
item[i] = r;
printf_s("array[%d] = %f\n", i, item[i]);
}
d.setLx(item);
}
#pragma managed
int main(array<System::String ^> ^args)
{
Grid2D d;
d._count = 10;
UnmanagedFillGrid(d);
Console::WriteLine("[managed] count = {0}", d._count);
//getLx returns pointer to double, I need to get in double^
//Is this possible ?
double^ managedLx = d.getLx();//How to convert ??
return 0;
}
首先:虽然它是 C++/CLI 中的有效类型,但您不应该使用 double^
。对值类型的托管引用是奇怪的、不必要的,并且在其他 .Net 语言(例如 C#)中根本不存在。
所以,看起来你的 double*
是一个数组。托管数组类型是 array<double>^
,而不是 double^
。这就是您应该在托管方面使用的内容。托管数组也知道自己的长度,因此您不需要单独公开计数。
为了将数据从 double*
移动到 array<double>^
,需要复制它。无法创建 array
对象以使其使用已由其他对象分配的内存,因此复制数据是唯一的可能。您可以使用 Marshal::Copy
方法,或使用 for
循环并自己复制数据。 (它们归结为同一件事。)