C++ cli 在cli类中声明本机类型?

C++ cli 在cli类中声明本机类型?,c++-cli,C++ Cli,我有一个 public ref class Test 在这个班里,我有: int frameWidth; int frameHeight; int frameStride; 当我尝试编译此文件时,会出现以下错误: error C2664: 'GetImageSize' : cannot convert parameter 1 from 'cli::interior_ptr<Type>' to 'int *' 错误C2664:'GetImageSize':无法将参数1从'cli:

我有一个

public ref class Test
在这个班里,我有:

int frameWidth;
int frameHeight;
int frameStride;
当我尝试编译此文件时,会出现以下错误:

error C2664: 'GetImageSize' : cannot convert parameter 1 from 'cli::interior_ptr<Type>' to 'int *'
错误C2664:'GetImageSize':无法将参数1从'cli::interior_ptr'转换为'int*'
GetImageSize是一个本机函数,仅当我将上面3个整数的声明移到类外部或调用GetImageSize的块内部时,它才起作用

我怎样才能解决这个问题

这3个INT需要由类内的多个函数访问,目前我之所以能够使用,是因为我将它们移到了类外,但我认为这不是正确的做法,因为它们是全局的。

根据,您看到这一点的原因是,int位于ref类中,垃圾收集器可以随意在堆中移动,int的地址可能会更改,而不会告诉您

为了克服这个问题,您需要告诉GC在使用对象时不要移动它们。要做到这一点,您需要使用

pin_ptr<int*> pinnedFrameWidth = &frameWidth;
pinnedFrameWidth=&frameWidth;
然后将pinnedFrameWidth传递到GetImageSize。当传入方法时,pin_ptr将自动转换为int*

使用pin_ptr时需要小心。因为GC不能在收集过程中移动测试类的实例,所以托管堆可能会变得支离破碎,最终会影响性能。理想情况下,在尽可能短的时间内固定尽可能少的对象

在.Net Rocks show中有一个关于pin指针的简短讨论。

根据,您看到这一点的原因是因为INT位于ref类中,垃圾收集器可以随意在堆中移动,INT的地址可能会更改,而不会告诉您

为了克服这个问题,您需要告诉GC在使用对象时不要移动它们。要做到这一点,您需要使用

pin_ptr<int*> pinnedFrameWidth = &frameWidth;
pinnedFrameWidth=&frameWidth;
然后将pinnedFrameWidth传递到GetImageSize。当传入方法时,pin_ptr将自动转换为int*

使用pin_ptr时需要小心。因为GC不能在收集过程中移动测试类的实例,所以托管堆可能会变得支离破碎,最终会影响性能。理想情况下,在尽可能短的时间内固定尽可能少的对象


在.Net Rocks show中有一个关于pin指针的简短讨论。

你能在调用GetImageSize的地方发布代码吗?这里是:bool StartCapture(){GetImageSize(&frameWidth,&frameHeight);}你能在调用GetImageSize的地方发布代码吗?这里是:bool StartCapture(){GetImageSize(&frameWidth,&frameHeight);}因为
framWidth
是一个整数(int),我认为它必须是
pin\ptr pinnedFrameWidth=&frameWidth
@colindesmond因为
framWidth
是一个整数(int),我认为它必须是
pin\ptr pinnedFrameWidth=&frameWidth@ColinDesmond