gpt4 book ai didi

c# - AccessViolationException 如果我将变量声明为公共(public)成员,而不是局部变量

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:03 24 4
gpt4 key购买 nike

我有 2 个互操作数据结构作为类中的私有(private)成员,

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

最佳答案

Interop_InitInterop_Run 发生了什么?您正在将两个成员 alphaLevelsfaceCgList 传递到 Interop_Init - 也许它保留了对它们的一些引用,以便在调用 时再次使用Interop_Run,此时它似乎正在访问不同类的私有(private)成员?

编辑:只是一个想法:)

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解释托管/非托管编码(marshal)处理在 Mono 中的工作方式——我正在努力为 Microsoft 的 dotNET 框架找到类似的信息性文章,但我的猜测是它应该以类似的方式工作。这是文章中的一段引述:

Additionally, if (a) the structure is located on the stack, and (b) the structure contains only blittable types, then if you pass a structure to an unmanaged function by-reference, the structure will be passed directly to the unmanaged function, without an intermediate unmanaged memory copy.

关于c# - AccessViolationException 如果我将变量声明为公共(public)成员,而不是局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8206598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com