2011-11-21 116 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