c# - 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;
}
我正在实例化Scene
andcam1
并且每个都得到一个包含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
有人可以帮忙吗?
解决方案
上次你说你不改变CallingConvention
,所以把值改为Cdecl
.
默认值DllImportAttribute
是WinApi
在函数调用后不清除堆栈。
C 代码的默认值__cdecl
也不会清除堆栈。它等待调用者清除它。
这发生了异常。
推荐阅读
- r - 使用 R 对时间线进行数据操作/插补
- ios - 检查浮点值
- hibernate - Hibernate:与两个 @JoinColumn 的关系上的 MappingException,其中一个列具有附加的 PK 只读映射
- c# - 输入的自定义效果。清除文本按钮
- python - 将键值对树转换为 json 对象
- node.js - 当项目根目录中存在 .npmrc 时无法登录到 npm
- python - 使用变量从列表中删除项目
- jquery - jQuery clearInterval 可以保留 jQuery 设置的背景图像吗?
- javascript - 我的网站无法向下滚动查看所有内容,我该如何解决?
- r - 完美对齐密度图和 geom_col 的 X 轴值