我有2个互操作数据结构作为类中的私有成员,
public class RunInterop
{
private AlphaShapeCg _alphaHandler;
private DoubleCgList alphaLevels;
private FaceCgList faceCgList;
public RunInterop()
{
faceCgList =new FaceCgList();
alphaLevels = new DoubleCgList();
Interop_Init(ref _alphaHandler, ref faceCgList, ref alphaLevels);
Interop_Run(ref _alphaHandler);
}
}
现在的问题是,我会在System.AccessViolationException
行获得Interop_Run
。
但是,如果我按以下方式重写代码:
public class RunInterop
{
private AlphaShapeCg _alphaHandler;
public RunInterop()
{
var faceCgList =new FaceCgList();
var alphaLevels = new DoubleCgList();
Interop_Init(ref _alphaHandler, ref faceCgList, ref alphaLevels);
Interop_Run(ref _alphaHandler);
}
}
然后我不会有任何问题。知道为什么会这样吗?
编辑:真正令人费解的是,为什么,如果我将faceCgList
和alphaLevels
都声明为局部变量,问题就会消失?
答案 0 :(得分:0)
Interop_Init 和 Interop_Run 会发生什么?您正在将 alphaLevels 和 faceCgList 这两个成员传递给 Interop_Init - 也许它会在调用时再次使用它们。 Interop_Run ,此时它可能似乎正在访问另一个类的私有成员?
编辑:只是一个想法:)
public class RunInterop
{
private AlphaShapeCg _alphaHandler;
private DoubleCgList _alphaLevels;
private FaceCgList _faceCgList;
public RunInterop()
{
AlphaShapeCg faceCgList = new FaceCgList();
DoubleCgList alphaLevels = new DoubleCgList();
Interop_Init(ref _alphaHandler, ref faceCgList, ref alphaLevels);
Interop_Run(ref _alphaHandler);
_alphaLevels = alphaLevels;
_faceCgList = faceCgList;
}
}
编辑:我发现这个link解释了托管/非托管编组如何在Mono中工作 - 我正在努力为微软的dotNET框架找到类似的信息性文章,但我的猜测是应该以类似的方式工作。以下是文章中的一句话:
此外,如果(a)结构位于堆栈上,并且(b) 结构只包含blittable类型,如果你传递了一个 通过引用结构到非托管函数,结构将是 直接传递给非托管函数,没有中间函数 非托管内存复制。