[英]Calling unmanaged C++ library (dll) from C# creates an access violation error (0xc0000005)
[英]c# to unmanaged c++ dll access violation / “frame not in module”
我有一個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
並使用cam1
和cam2
分別獲取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
有人可以幫忙嗎?
上次您說不更改CallingConvention
,請將值更改為Cdecl
。
DllImportAttribute
默認值為WinApi
,它在函數調用后不會清除堆棧。
C代碼的默認值為__cdecl
,它也不會清除堆棧。 它等待呼叫者清除它。
發生例外。
最后,我將整個嵌套結構整理到一個指針中-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);
其他一切都保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.