Поэтому я пытаюсь запустить нативную функцию c ++ в dll из некоторого кода на c #. И все работает нормально, однако, когда я использую ‘out’ в своем вызове функции, я получаю нарушение доступа к памяти. Вот как это выглядит:
Функция C #
[DllImport(pluginName)]
public static extern IntPtr AddTriangleFixtuers(ShapeDef shapeDef, IntPtr toBody, ref Vector2 vertices, int triangleCount, Vector3 row1, Vector3 row2, out int fixtureCount);
…
int test = 1;
B2D.AddTriangleFixtuers(def, body.body, ref shapeTriangles[0], shapeTriangles.Length/3, firstRow, secondRow, out test);
Функция C ++
EXTERN_DLL_EXPORT b2Fixture* __stdcall AddTriangleFixtuers(ShapeDef shapeDef, IntPtr* toBody, b2Vec2* vertices, int triangleCount, b2Vec3 row1, b2Vec3 row2, int& fixtureCount) {
fixtureCount = 0;
b2Fixture* lastFixture = NULL;
return lastFixture;
}
Я свернул код, чтобы выделить проблему, с которой сталкиваюсь. Как только я пытаюсь установить fixtureCount в коде c ++ на что-либо, я получаю следующую ошибку:
Исключение типа «System.AccessViolationException» произошло в Assembly-CSharp.DLL, но не было обработано в коде пользователя
Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
Хорошо, я наконец понял это. Именно row1 и row2 стали причиной нарушения доступа к памяти. Хотя я не использовал их в своем коде C ++. Я должен был отправить значения x, y, z как числа с плавающей точкой, чтобы исправить ошибку.
Так что проблема заключалась в преобразовании из Vector3 в b2Vec3. Как упоминал Ганс в комментариях, проблема не в fixtureCount.