AccessViolationException如果我将变量声明为Public Members,而不是局部变量

时间:2011-11-21 02:19:22

标签: c#

我有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);
        }
}

然后我不会有任何问题。知道为什么会这样吗?

编辑:真正令人费解的是,为什么,如果我将faceCgListalphaLevels都声明为局部变量,问题就会消失?

1 个答案:

答案 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类型,如果你传递了一个   通过引用结构到非托管函数,结构将是   直接传递给非托管函数,没有中间函数   非托管内存复制。