2011-11-21 113 views
2

我有2个互操作的数据结构的一类私有成员,AccessViolationException如果我变量声明为公共成员,而不是局部变量

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

现在的问题是,我将在Interop_Run得到System.AccessViolationException线。

但是,如果我用以下方式重写我的代码:

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为局部变量,问题就会消失?

+0

“_alphaHandler”声明在哪里? –

+0

也,你的代码闻起来。 –

+0

@ DanielA.White,问题更新 – Graviton

回答

0

Interop_InitInterop_Run会发生什么?你是路过的两名成员alphaLevelsfaceCgListInterop_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解释托管/非托管封送处理在单是如何工作的 - 我在努力寻找一个类似的情报文章微软的dotNET Framework,但我的猜测是它应该以类似的方式工作。下面是文章一个报价:

此外,如果(一)结构位于栈上,和(b) 结构只包含Blittable型,那么如果你传递一个 结构的非托管函数通过引用,该结构将被直接传递给非托管功能的 ,而没有中间的 非托管内存副本。

+0

我不这么认为,原因是因为如果我将faceCgList和alphaLevels声明为局部变量,问题就会消失? – Graviton

+0

当您将它们声明为私有成员时,当您移入非托管代码时,dotNET会尝试保护该内存空间。局部变量可能不是这种情况。 – Veldmuis

+0

关于如何解决这个问题的任何想法? – Graviton