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

加里拉

我有一个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

有人可以帮忙吗?

加里拉

最后,我将整个嵌套结构整理到一个指针中-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);

其他一切都保持不变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从C到C#的结构中获取非托管的可变长度C数组?

从非托管C ++ DLL返回字符串到C#

将字节数组从 C++ 非托管 dll 传递到 C# unity

在C#中使用非托管DLL

从非托管C ++ / CLI调用重载的C#数组访问

无法使用C#和Robert Giesecke的非托管导出工具创建非托管dll

P /调用-从C#调用非托管DLL

NUnit C#使用DllImport的非托管dll引发BadImageFormatException

了解C#中的非托管关键字

在C#中模拟本机/非托管异常

c# - 如何从静态类中处理非托管对象?

从托管C#代码中调用非托管C ++代码以生成脱机域加入Blob

在C#项目中使用托管dll(使用非托管dll)

如何在C#中处置托管对象和非托管对象?

将字符串编组到非托管内存中,然后将它们传递给C ++,然后再次返回C#

将本机非托管 C++ DLL 加载到托管 C# 应用程序会导致 DLL 输出垃圾

从C#调用C ++ dll。“无法封送'返回值':无效的托管/非托管类型组合。”

始终从 C# 中的同一线程调用非托管 dll

如何在C#中定义非托管dll依赖项

调用dll时c#中的访问冲突错误

使用Mupen64Plus非托管C dll API命令填充C#结构

C#运行时中的C ++非托管DLL导入失败

将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

当传递给非托管C DLL函数时,C#结构变量保持为空

C#将指向结构(包含不可复制类型)的指针传递给非托管C ++ DLL

如何在非托管C ++中创建托管对象,同时在Java和C#之间将其包装为JNA?

C#DLL异常未在非托管C ++中捕获

从非托管C ++代码访问WPF

C#使用Memory <T>或ArraySegment <T>访问非托管数组吗?