繁体   English   中英

C#到非托管C ++ DLL访问冲突/“框架不在模块中”

[英]c# to unmanaged c++ dll access violation / “frame not in module”

我有一个C#应用程序(在Unity3d mono中),它通过C-API将一些数据传递给c ++非托管DLL。 它传入包含数组的嵌套Struct。 一切正常,直到C-API关闭(在函数的}时),然后我从VS2017获得“ Frame not in Module”消息(如果我“>“ Continue”,我将收到访问冲突0xC0000005 ,反汇编建议可能缺少ptr-因此可能是取消引用错误)

编辑:我认为这可能是我的源结构具有指向数组的指针//编辑

是什么原因导致此“框架不在模块中”? -作为消息不是很丰富

那我该怎么办?

我的代码...

我有一个ac#结构层次结构。

private struct Vector3
{
    public float x;
    public float y;
    public float z;
}

private structure Location
{
    public Vector3 coords;
    public float distanceFromOrigin;
}

private struct Locations
{
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 10)]
    public Location[] locations;
}

private struct Scene
{
    public Locations cam1;
    public Locations cam2;
    public float timeInMilliSecs;
}

我正在实例化Scene并使用cam1cam2分别获取10个位置的数组。 一切都很好。 至此可以正常工作,并且用正确的数据填充数据结构。

我将Scene的实例传递给非托管DLL

[DllImport(dllname)]
private static extern void updateScene(Scene scene);

在我的C ++中

extern "C" {
    DLL_EXPORT void updateScene(Scene scene);
}

和超载

void updateScene(Scene scene) {
    setSecene(scene); // this calls function fine but with erroneous data
}

和等效结构的签名

struct Vector3
{
    float x;
    float y;
    float z;
}

struct Location
{
    Vector3 coords;
    float distanceFromOrigin;
}

struct Locations
{
    Location locations[10];
}

struct Scene
{
    Locations cam1;
    Locations cam2;
    float timeInMilliSecs;
}

将带有正确数据的Scene结构传递给C ,然后将其传递给c ++。 但是随后出现了问题-我猜这是内存问题,但是我不确定该怎么办。

查看反汇编可能表明它是指针问题?

0000000040BDAE57 49 89 0B mov qword ptr [r11],rcx

有人可以帮忙吗?

上次您说不更改CallingConvention ,请将值更改为Cdecl

DllImportAttribute默认值为WinApi ,它在函数调用后不会清除堆栈。

C代码的默认值为__cdecl ,它也不会清除堆栈。 它等待呼叫者清除它。

发生例外。

最后,我将整个嵌套结构整理到一个指针中-c#中的所有更改

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
private static extern void updateScene(IntPtr scene);

然后,在我调用updateScene()之前,我正在整理场景结构

IntPtr  scenePtr = Marshal.AllocHGlobal(Marshal.SizeOf(scene));
Marshal.StructureToPtr(scene, scenePtr , true);
updateScene(scenePtr);

其他一切都保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM