首页 > 解决方案 > c# 到非托管 c++ dll 访问冲突/“框架不在模块中”

问题描述

我有一个 C# 应用程序(在 Unity3d 单声道中),它通过 C-API 将一些数据传递给 c++ 非托管 DLL。它传入包含数组的嵌套结构。一切都很好,直到 C-API 关闭时(在}函数处)当我从 VS2017 收到“Frame not in Module”消息时,(如果我>继续“我将收到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;
}

我正在实例化Sceneandcam1并且每个都得到一个包含10 个位置cam2的数组。一切都很好。到目前为止按预期工作,并且数据结构中填充了正确的数据。

我将实例传递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

有人可以帮忙吗?

标签: c#c++unity3ddllvisual-studio-2017

解决方案


上次你说你不改变CallingConvention,所以把值改为Cdecl.

默认值DllImportAttributeWinApi在函数调用后不清除堆栈。

C 代码的默认值__cdecl也不会清除堆栈。它等待调用者清除它。

这发生了异常。


推荐阅读