У меня есть приложение на C # (в Unity3d mono), которое передает некоторые данные в неуправляемую DLL c ++ через C-API.Он передается во вложенном Struct, который включает в себя массив.Все хорошо, пока C-API не закрывается, когда (в }
функции), когда я получаю сообщение «Frame not in Module» от VS2017, (если я «> Продолжить», я получу нарушение прав доступа 0xC0000005
который, как предполагает дизассемблирование, может пропустить ptr - так, вероятно, ошибка разыменования)
РЕДАКТИРОВАТЬ: Я думаю, это может быть из-за того, что моя исходная структура имеет указатель на массив // EDIT
чтовызывает это "Кадр не в модуле"?- оно не очень информативно как сообщение
и что я могу с этим поделать?
Мой код ...
У меня есть 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
, и с cam1
и cam2
каждый получает массив 10 Locations.Все хорошо.На данный момент работает, как и ожидалось, и структура данных заполнена правильными данными.
Я передаю экземпляр Scene
в неуправляемую DLL
[DllImport(dllname)]
private static extern void updateScene(Scene scene);
В моем c ++ Iиметь
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
Может кто-нибудь помочь, пожалуйста?